Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa Eclipse链接在重新附加实体树后的奇怪行为_Jpa_Jakarta Ee_Eclipselink - Fatal编程技术网

Jpa Eclipse链接在重新附加实体树后的奇怪行为

Jpa Eclipse链接在重新附加实体树后的奇怪行为,jpa,jakarta-ee,eclipselink,Jpa,Jakarta Ee,Eclipselink,我有一个标准的JEE7应用程序,它使用eclipselink作为JPA引擎,实体树将使用CascadeType注释所有实体。所有的OneToMany关系中的所有。所有实体都具有来自数据库序列的@GeneratedValueID 在一个事务中,我获取了一个实体树的托管实例,然后分离根目录,然后将树的所有@Id字段和@Version字段设置为null,并合并根实体 正如我所期望的,树中的所有托管实体(两个除外)都有新的ID。问题是两个不同类型的实体在其id字段中保留空值,提交时出现以下异常: org

我有一个标准的JEE7应用程序,它使用
eclipselink
作为
JPA
引擎,实体树将使用
CascadeType注释所有实体。所有的
OneToMany
关系中的所有
。所有实体都具有来自数据库序列的
@GeneratedValue
ID

在一个事务中,我获取了一个实体树的托管实例,然后分离根目录,然后将树的所有
@Id
字段和
@Version
字段设置为null,并合并根实体

正如我所期望的,树中的所有托管实体(两个除外)都有新的ID。问题是两个不同类型的实体在其id字段中保留空值,提交时出现以下异常:

org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null or zero primary key encountered in unit of work clone [EntityA [id=null, businessId=17EN000000000083]], primary key [null]
我在EntityA中尝试了equals和hashCode方法中的一些更改,主要是为了避免在两个实体的ID都为null时将两个实体视为equals,但什么也没有发生。该行为不是确定性的,在调试期间,有时会生成id,但通常为null

有人能给我一个关于这个问题的提示吗

--编辑


当我们在有问题的关系中使用
FetchType.EAGER
而不是
FetchType.LAZY
时,
merge
按预期创建了ID。有人能解释为什么会发生这种情况吗

除非序列化实体,否则它不会真正分离。EclipseLink的功能允许在上下文仍然可用的情况下获取惰性关系,这意味着直到EntityManagerFactory关闭或实体序列化。因此,如果您“分离”实体并遍历一个惰性的、未蚀刻的关系,则引用的实体将从执行初始读取的EntityManager中读入,并进行管理


不管怎样,由于跟踪其他工件的更改被编织到您的实体中,如果您希望使用新标识持久化数据,最好复制实体。

除非您序列化实体,否则它不会真正分离。EclipseLink的功能允许在上下文仍然可用的情况下获取惰性关系,这意味着直到EntityManagerFactory关闭或实体序列化。因此,如果您“分离”实体并遍历一个惰性的、未蚀刻的关系,则引用的实体将从执行初始读取的EntityManager中读入,并进行管理


不管怎样,由于跟踪其他工件的更改被编织到您的实体中,如果您希望使用新标识持久化数据,最好复制您的实体。

如果您尝试克隆现有树,为什么不实现克隆方法来创建新副本?否则,如果直接合并(或者更好地说,持久化)问题实体而不是通过图形,会发生什么?我正在尝试创建一个新版本的实体树。在分离并设置null ID之后,我增加了每个实体的版本号。如果我使用克隆,我必须手动克隆树的所有实体,使用级联分离,我只分离根实体,并在更改后将其合并回来。在我看来,似乎是与eclipse链接的标识映射相关的东西导致了这个问题。如果将问题实体隔离,则创建一个新实体并将其持久化,一切正常。有人知道eclipse链接实体管理器在合并过程中如何检查实体是否已经存在于缓存中吗?在EclipseLink使用更改跟踪的环境中,创建实体是错误的。您需要创建实体的副本,而不仅仅是重用现有实体并更改其PK。试试看,或者按照我的建议直接持久化对象。如果你的懒惰关系不是在你的“分离”之前得到的,那么你所看到的行为很容易解释——你没有解释你是如何分离这些实体的。EclipseLink允许访问惰性关系,只要从中读取的上下文仍然可用,因此访问该关系就是在托管实体中读取。如果您试图克隆现有树,为什么不实现克隆方法来创建新副本?否则,如果直接合并(或者更好地说,持久化)问题实体而不是通过图形,会发生什么?我正在尝试创建一个新版本的实体树。在分离并设置null ID之后,我增加了每个实体的版本号。如果我使用克隆,我必须手动克隆树的所有实体,使用级联分离,我只分离根实体,并在更改后将其合并回来。在我看来,似乎是与eclipse链接的标识映射相关的东西导致了这个问题。如果将问题实体隔离,则创建一个新实体并将其持久化,一切正常。有人知道eclipse链接实体管理器在合并过程中如何检查实体是否已经存在于缓存中吗?在EclipseLink使用更改跟踪的环境中,创建实体是错误的。您需要创建实体的副本,而不仅仅是重用现有实体并更改其PK。试试看,或者按照我的建议直接持久化对象。如果你的懒惰关系不是在你的“分离”之前得到的,那么你所看到的行为很容易解释——你没有解释你是如何分离这些实体的。EclipseLink允许访问惰性关系,只要从中读取的上下文仍然可用,因此访问该关系就是在托管实体中读取。