问题标签 [jpa-2.2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
479 浏览

java - 当我没有设置任何 CascadeTypes 时,为什么默认情况下休眠级联

当我尝试保留新swipe对象时,我遇到了以下异常: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: org.munch.database.models.bunch.Munch

这是我正在执行的代码:

我还在下面粘贴了我的实体以供参考。调用时entityManager.persist(it),会抛出上述错误。出于某种原因,试图坚持OneToMany实体的一面也是行不通的。我已经确保两个CascadeTypes数组都是空的,所以根据我的理解,只有Swipe我调用entityManager.persist()的应该写入数据库。

如果我替换persistmerge操作成功,但合并会导致休眠生成一个额外select的 theMunch和一个selectfor the Swipe,这是不必要的操作。然而,合并似乎没有将更新操作级联到Munch它只执行 2 个选择语句和 1 个插入。

回顾一下:Hibernate 似乎在不应该级联Persist操作时进行级联操作。一个解决方案是使用merge,但使用persist应该只导致1 insertwhere asmerge结果2 selects + 1 insert

除了执行本地查询以插入/更新之外,我没有其他想法,但如果可能的话,我想避免这种情况。

这是我的实体:

Munch

Swipe

SwipeIdKey

0 投票
2 回答
433 浏览

java - LocalDateTime JPA 2.2 的 NULL 值 - PostgreSQL

我无法为下面描述的字段设置空值。我想插入 NULL 作为默认值。

当我设置 NULL 时,它显示以下错误:

我使用 EclipseLink 作为 JPA 实现。

0 投票
1 回答
449 浏览

hibernate - 在带有 spring/hibernate 的 Websphere 上使用 jpa2.2

我最近继承了一个 Spring/Hibernate 应用程序,并将其升级为Spring 5.2.8, SpringSecurity 5.3.4, Hibernate 5.4.21.

我们正在部署Websphere 8.5.5(完全,而不是自由)。

当我尝试运行该应用程序时,我得到一个异常,我认为相关部分是:

...嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/applicationContext-hibernate.xml] 中定义名称为“auditSessionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 java.lang.NoSuchMethodError: javax/persistence/JoinColumn.foreignKey()Ljavax/persistence/ForeignKey; (从文件:/C:/Program Files (x86)/IBM/WebSphere/AppServer/plugins/javax.j2ee.persistence.jar 由 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@2472a612 加载)从类 org 调用。 hibernate.cfg.AnnotationBinder(从文件加载:/C:/Program%20Files%20(x86)/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/Node01Cell/nameof_war.ear/nameof.war/WEB-INF/lib /hibernate-core-5.4.21.Final.jar 来自 com.ibm.ws.classloader.CompoundClassLoader@71ed602b[war:nameof_war/nameof.

我注意到它使用的是 JPA 的 Websphere 版本,而不是我在战争中包含在 jar 中的那个。Websphere 附带javax.j2ee.persistence.jar- JPA 版本2.0,它解释了错误。

对另一个 SO 问题的回答让我来到这里:https ://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/tejb_jpa3rdparty.html

此链接试图解释如何使用第三方持久性提供程序。

问题是,链接说要使用persistence.xml;但我继承的应用程序没有那个 xml 文件。它只有applicationContext-hibernate.xml和 orm.xml。

我试过创建一个persistence.xml

出现在 WAR 文件中的正确位置;但我不知道这是否正确 - 也不知道我是否还必须更新任何其他文件?我是否需要在其他地方引用该持久性单元?

我还将 WebSphere 中的类加载器更新为最后一个父类;但我仍然收到如上所示的错误。

我错过了哪些步骤?我需要在applicationContext-hibernate.xml(或其他地方)做些什么改变才能让它发挥作用?

我的 applicationContext-hibernate.xml样子:

0 投票
2 回答
1355 浏览

java - java.lang.ClassCastException: [B 不能转换为 [Ljava.lang.Object; 在使用 JPA 2.2 query.getResultStream().findFirst()

我的 Spring Data repository 方法的代码如下:

如您所见,我试图以字节数组的形式获取shippingLabel列,该列在我的 Postgres 模式中定义为bytea。运行时出现以下异常:

java.lang.ClassCastException:[B 无法转换为 [Ljava.lang.Object; 在 org.hibernate.internal.ScrollableResultsImpl.prepareCurrentRow(ScrollableResultsImpl.java:203) 在 org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:101) 在 org.hibernate.query.internal.ScrollableResultsIterator.hasNext(ScrollableResultsIterator.java :33) 在 java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1811) 在 java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126) 在 java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline. java:499) 在 java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:486) 在 java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) 在 java.util.stream.FindOps$FindOp.evaluateSequential (FindOps.java:152) 在 java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.util.stream。org.hibernate.query.spi.StreamDecorator.findFirst(StreamDecorator.java:260)

我想知道这是否是这里的预期行为,提前感谢您的回答。

目前,解决方法是使用 JPA 2.1 变体:

返回 query.getResultList().stream().findFirst();

作为环境,我使用的是Spring Boot 2.3.3Hibernate版本是5.4.20

0 投票
1 回答
349 浏览

java - Netbeans 12.0 - 从 DB 生成实体类使用 Java Date 类而不是 LocalDate

我正在使用 Netbeans 12.0,并为我的数据库表创建我的实体类,我使用 Netbeans Entity Classes from Databasedate除了将我的所有列默认为 Java 8 之前的类之外,它的效果很好Date,而且我最近发现@Temporal从我的类变量(对应于我的表中的列)中删除注释LocalDate不会导致问题。

这是 Netbeans 创建的:

这是我的更新版本:

LocalDate从我的数据库创建实体类时,是否可以让 Netbeans 使用该类?

我的 Java 应用程序中有许多表具有相应的实体,虽然理论上我可以遍历每个表并用日期替换列,但这听起来并不有趣,尤其是对于未来的实体而言。

我的项目是 Java 8,使用 JPA 2.2 和 EclipseLink 2.7.7。

0 投票
2 回答
110 浏览

hibernate - 组合PK规范无效:PK类中的PK字段或属性的名称与实体类的名称必须对应

我有以下简单的设计:

在此处输入图像描述

球员统计数据是每个球员的统计数据,它为球员保存整场比赛的状态,例如球衣号码。

它引用了一个团队成员,该成员由特定名单中的球员识别(基本上,一个球员可以是多个名单的一部分,例如在一个赛季中为多个球队效力的球员)。

球员统计数据与比赛的得分相关,无论是主场还是客场得分。它基本上是一个带有附加属性/列的连接表。你明白了。

因此,表所引用的两个PlayerStats表都有一个复合 PK。我使用派生标识符映射PlayerStat实体,见下文。

评分实体+ID类(无特殊):

团队成员实体+ID类(无特殊):

玩家统计实体 + ID 类(派生标识符):

例外:

问题

映射有什么问题?

PlayerStat实体有两个关系scoreteamMember并且各自@IdClass被调用PlayerStatId有两个嵌套的复合 PK类引用,根据需要调用scoreteamMember,它们的类型是各自的 PK 类ScoreIdTeamMemberId

我在 WildFly 20 环境中使用最新的 EclipseLink 2.7.7。

这可能是某种错误吗?

我查看了几个描述派生标识符的来源,但我没有看到映射存在任何固有的错误。

0 投票
1 回答
68 浏览

java - 为什么 JPA 2.2 将 java.util.Date 存储为 null

我有一个包含java.util.Date字段的 Java EE 实体类。由于某种原因,该字段的值没有被存储。

这是一个在表中填充一行的单例:

稍后当我检索并检查数据时,日期字段为空:

知道如何存储值java.util.Date吗?

0 投票
1 回答
122 浏览

java - 该语句被中止,因为它会导致重复的键值

我的 Java EE 应用程序的一部分是用户管理。我的开发环境是 Windows 10 上的 Netbeans 12.0、JDK 14、Glassfish 服务器 5.1、Apache Derby DB 和 eclipse 持久性 JPA。目前,在开发阶段,我已将 JPA 配置为删除和创建表,每当我重新启动服务器时。

我有一个实体 bean“用户”,它被配置为使用自动生成的实体主键:

每当服务器启动时,我使用 JAXB 机制使用 XML 文件中的测试数据填充所有表。这是我的“用户”实体 bean 的 UserList.xml 示例。

当应用程序启动并运行时,我可以通过前端 JSF(Java Server Faces)页面直观地验证数据,一切看起来都很好,这表明 JAXB 代码已成功将初始用户数据加载到数据库中。当我尝试从前端 JSF 页面添加一个新用户时,这个可怕的问题就开始了,该页面以以下异常终止:

我不确定为什么当“用户”实体利用自动密钥生成时出现此错误,最初的 3 条数据已经加载到表中,并且自动密钥生成器已经增加到 4 (假设 JPA 从 index=1 开始生成密钥)?所以我通过 JSF 前端添加的第一个用户(与 JAXB 共享相同的持久性代码,将 XML 文件中的初始数据添加到表中)应该分配 id=5?

最初,我想,也许 XML 文件中的 Id 字段(即 1)与此错误有关,但再次与自动密钥生成方案有关,XML 中的 Id 应该被 JPA 自动生成的值覆盖吗?

我已经在这个论坛和其他地方阅读了许多关于该错误的帖子,但除了错误之外没有发现任何与我的情况相同的共同点。感谢您对此错误的根本原因以及如何在没有应用程序生成主键的情况下修复它的任何清晰解释。

更新 1:表中的剩余数据

经过一番排查,我发现在应用启动的时候User表中总是有剩余数据,这违反了我在persistence.xml文件中选择的drop-and-create策略(可能是JPA的问题?)在这个在这种情况下,当容器调用我的 Singleton 类 @postConstruct 注释方法 loadData() 以从 XML 文件加载初始数据时,自动密钥生成从 1 开始,这会导致与具有相同 ID 的剩余行之一发生冲突。我修改了代码以在服务器启动时从表中删除所有行,问题消失了,但是,我在日志文件中看到以下异常,该异常不会导致应用程序出现任何问题或中断:

我绝对没有更新或篡改任何主键,我将该任务留给了自动生成功能,所以我不确定为什么会出现这个异常?(如果需要源代码,我很乐意提供)。

0 投票
0 回答
142 浏览

hibernate - 使用 JPA EntityManager 时,实体的数据库持久化很慢

目前我遇到了一个问题,我需要提高对 Oracle19c 数据库的插入性能(也需要批量插入)。在某些情况下,我可以预期 250,000 条记录(每条记录代表一个实体)。将我的数据保存到数据库中需要将近 15 分钟,而我的计数只有 9000 个。需要这么长时间是有原因的吗?以及如何提高它的性能?下面是我的持久性逻辑以及我的实体类,以及设置为尝试帮助提高批量插入性能的休眠属性:

在我的休眠配置类中:

实体类:

使用EntityManager的方法:

0 投票
0 回答
62 浏览

hibernate - 当所有人都拥有该实体(没有EntityManager / Session)时,如何锁定()JPA / Hibernate实体?

我正在处理一些遗留代码,这些代码在某些地方没有一种干净可靠的方式来获取给定实体的 JPA EntityManager(或 Hibernate Session),以根据需要调用 lock(...) 方法。本质上,我们在实体中有一个方法,需要执行以下操作:

问题是如何做到这一点 - 如何访问该实体管理器或会话?我们设计了两种方法来完成我们需要的事情,即使两者都有效,但没有一种是可取的:

选项 #1 - 令人尴尬的属性触发器

...“欺骗”Hibernate(我们使用字节码增强,顺便说一句)来执行锁定本身,然后撤消更改但保留锁定(我们会在任何“廉价”属性上执行此操作)。

选项 #2:不恰当地滥用 Hibernate 字节码增强及其内部 API 的反射

是否有适当、干净的方法来获取当前管理/拥有特定实体的 EntityManager / Session?当然,我们知道底层引擎必须已经知道这一点……但这似乎被很好地隐藏起来了。

附加说明:ThreadLocal 在某些项目中可能是一个答案,但在这个项目中不是。不要问。