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在合并期间作为托管实体的一部分分离的实体_Jpa_Ejb 3.1 - Fatal编程技术网

JPA在合并期间作为托管实体的一部分分离的实体

JPA在合并期间作为托管实体的一部分分离的实体,jpa,ejb-3.1,Jpa,Ejb 3.1,我在应用程序中缓存了一些简单的实体bean(EJB3.1、Glassfish、EclipseLink),所以我不必每次都用findById在数据库中查找它们,因为应用程序需要快速。这些实体bean是只读的 例如,实体bean Country或Currency在本地缓存中 JavaEE应用程序中出现了一些希望更新复杂实体bean(即客户)的过程,该实体bean使用上述简单bean(国家、货币…) 然后发生的情况是,由于简单实体bean与JPA上下文的连接丢失,当在Customer bean上尝试.

我在应用程序中缓存了一些简单的实体bean(EJB3.1、Glassfish、EclipseLink),所以我不必每次都用findById在数据库中查找它们,因为应用程序需要快速。这些实体bean是只读的

例如,实体bean Country或Currency在本地缓存中

JavaEE应用程序中出现了一些希望更新复杂实体bean(即客户)的过程,该实体bean使用上述简单bean(国家、货币…)

然后发生的情况是,由于简单实体bean与JPA上下文的连接丢失,当在Customer bean上尝试.merge()时,JPA希望将简单实体bean保存为数据库中的新记录,尽管这些记录在数据库中已经100%存在,所以我猜这是一个“分离实体”问题

例如

Country country = getFromCacheByName("GB"); // detached entity, but exists in database
Customer customer = getCustomerFromJPA(); // existing JPA attached entity
customer.setCountry(country);
EntityManager.merge(customer); // pseudo code
如何修复最后一行或bean(客户)本身,使其不会尝试在.merge()上保存从属对象(国家/地区)

谢谢。

在客户中设置国家/地区之前,您应该先对该国家/地区执行查找()或合并()。此外,请确保它具有正确的Id


不过,在客户上合并也应该可以工作,如果其Id存在,它会尝试插入国家,这很奇怪,但这可能取决于您如何配置。你是否在国家关系上进行级联合并

请注意,EclipseLink有自己的缓存。因此,可能不需要应用程序缓存。

在客户中进行设置之前,应该先对国家/地区执行查找()或合并()。此外,请确保它具有正确的Id


不过,在客户上合并也应该可以工作,如果其Id存在,它会尝试插入国家,这很奇怪,但这可能取决于您如何配置。你是否在国家关系上进行级联合并


请注意,EclipseLink有自己的缓存。因此,您的应用程序缓存可能不需要。

作为注释,我已经尝试了。从缓存中检索(国家/地区)后,JPA仍然尝试将简单bean作为事务的一部分进行持久化(上面的最后一行代码)。无论如何,我不需要合并这些简单的bean,我只希望它们不会作为新记录保存在数据库中,因为它们已经存在。与原始问题无关,您是否考虑过使用外键来
国家
,而不是在
客户
中设置它,然后进行合并。我想您在创建客户之前会有country object。嗨,Nayan,我真的不明白您的建议。需要详细说明吗?类似于
customer.setCountryId(country.getId())
,不包括整个country对象,而是包含其引用完整性的主键。您好,是的,这会起作用。但是,如果简单的事情做不到,那么JPA的复杂性又有什么意义呢作为一个注释,我在从缓存中检索后尝试了.merge(country),但它并没有真正起作用,JPA仍然尝试将简单bean作为事务的一部分进行持久化(上面的最后一行代码)。无论如何,我不需要合并这些简单的bean,我只希望它们不会作为新记录保存在数据库中,因为它们已经存在。与原始问题无关,您是否考虑过使用外键来
国家
,而不是在
客户
中设置它,然后进行合并。我想您在创建客户之前会有country object。嗨,Nayan,我真的不明白您的建议。需要详细说明吗?类似于
customer.setCountryId(country.getId())
,不包括整个country对象,而是包含其引用完整性的主键。您好,是的,这会起作用。但是,如果简单的事情做不到,那么JPA的复杂性又有什么意义呢我试着做EntityManager.merge(国家)-它没有帮助。关于EclipseLink缓存和JPA缓存。我在很多地方都有类似daoSomething.findByName(“a”)的代码,它返回简单实体(即货币)。每次它进入数据库并选择。。。从ID=。。。就好像根本不存在缓存一样。知道如何在EclipseLink中激活缓存吗?我谈论的是一些非常琐碎的事情,比如通过ID或一列获取简单的实体。“你是在国家关系上级联合并吗”-关于这一点,我没有在任何关系上设置级联类型,所以它应该是默认的。因此,客户只拥有一个简单的财产@manytone-Country;没有更多的注释。这是我的错。实际上,父对象上的merge()确实起作用,我使用的代码要复杂一些,并且没有调用.merge()。谢谢你友好的回答。我试着做了EntityManager.merge(国家)-没有帮助。关于EclipseLink缓存和JPA缓存。我在很多地方都有类似daoSomething.findByName(“a”)的代码,它返回简单实体(即货币)。每次它进入数据库并选择。。。从ID=。。。就好像根本不存在缓存一样。知道如何在EclipseLink中激活缓存吗?我谈论的是一些非常琐碎的事情,比如通过ID或一列获取简单的实体。“你是在国家关系上级联合并吗”-关于这一点,我没有在任何关系上设置级联类型,所以它应该是默认的。因此,客户只拥有一个简单的财产@manytone-Country;没有更多的注释。这是我的错。实际上,父对象上的merge()确实起作用,我使用的代码要复杂一些,并且没有调用.merge()。谢谢你善意的回答。