Spring 在瞬态方法中使用EntityManager.merge()后,数据库中出现双实例
我是Spring的新手,我的应用程序是用SpringRoo开发的,它有一个Cron,每天下载一些文件并更新数据库 下载并解析文件后,使用merge()完成更新, 实体类数据集有一个名为resources的列表,在下载后我会:Spring 在瞬态方法中使用EntityManager.merge()后,数据库中出现双实例,spring,hibernate,jpa,spring-roo,Spring,Hibernate,Jpa,Spring Roo,我是Spring的新手,我的应用程序是用SpringRoo开发的,它有一个Cron,每天下载一些文件并更新数据库 下载并解析文件后,使用merge()完成更新, 实体类数据集有一个名为resources的列表,在下载后我会: dataset.setResources(resources); dataset.merge(); 和dataset.merge()执行以下操作: @Transactional public Dataset Dataset.merge() { if (this.e
dataset.setResources(resources);
dataset.merge();
和dataset.merge()执行以下操作:
@Transactional
public Dataset Dataset.merge() {
if (this.entityManager == null) this.entityManager = entityManager();
Dataset merged = this.entityManager.merge(this);
this.entityManager.flush();
return merged;
}
我希望做dataset.setResources(resources);我会覆盖已归档的资源,因此即使是数据库条目也会被覆盖
但我在数据库中得到了两个条目:每个资源出现两次,ID不同(增量)
我如何才能成功地让我的应用程序进行更新而不插入?一个简单的解决方案是手动删除旧资源,然后调用merge();是这样还是有更智能的解决方案?当您使用Hibernate作为持久性引擎并且您的实体具有版本字段时,就会出现这种情况 通常,ID字段是我们在数据库中将分离的对象与其持久状态合并时所需的字段,但是Hibernate会考虑版本字段,如果不设置它(它为null),Hibernate会丢弃ID字段的值,并创建一个具有新ID的新对象 要知道您是否受到Hibernate这一奇怪特性的影响,请在version字段中设置一个值,如果抛出异常,您就会得到它。在这种情况下,最好的解决方法是解析包含正确版本值的数据。另一种方法是禁用版本检查(请参阅Hibernate ref guide了解它)或在合并之前加载持久状态