JPA实体存在异常

wgx48brx  于 2023-03-03  发布在  其他
关注(0)|答案(5)|浏览(185)

我目前面临的问题如下:

Exception in thread "main" javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [de.entities.Genre#28]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1359)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
at de.model.DatabaseBuilder.importData(DatabaseBuilder.java:87)
at de.main.Main.main(Main.java:55)

所以Exception告诉我,我想插入两个具有相同主键id的不同对象。
我想使用JPA插入到数据库中的所有数据都来自一个XML文件。我使用SAXParser解析这个文件。当然,有许多类型条目的id为28,因为许多电影都有相同的类型。
如果我使用自动生成的id,数据将不再正确,因为所有的id都是由XML文件正确给出的。
我该如何解决这个问题呢?为什么JPA不能忽略这个事实,即这个对象已经存在于数据库中,而只是将电影的id和类型插入到我的m:n表中?

m1m5dgzv

m1m5dgzv1#

你的体裁Map似乎有一个错误的关系。从你的用例来看,我认为它应该是一个多对多的关系。
流派的有效Map应如下所示:

@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.REFRESH, })
@JoinTable(name = "MovieGenre", joinColumns = { @JoinColumn(name = "Movie_Id") }, inverseJoinColumns = { @JoinColumn(name = "Genre_Id") })
public Set<Genre> getGenres() {
     return this.genres;
}
jv2fixgn

jv2fixgn2#

在我的案例中,我使用了手动事务管理,这需要更多的手动操作。

entityManager.clear();
...
entityManager.persist(entityToPersist);

clear()会分离实体管理器中可能存在于先前插入中的任何剩余实体,即使数据库在此之后已被清除

tp5buhyn

tp5buhyn3#

要么直接在Genre示例上调用persist,要么在movie上调用persist,movie-〉GenreMap有级联persist,JPA要求提供者在分离实体上调用persist时抛出异常,因为persist意味着希望提供者插入它。并且因为它已经存在而被分离。2所以你会得到一个异常。3听起来你的解析器不能分辨出类型实体是同一个示例,创建同一数据的多个示例也是如此。如果无法解决此问题,您可以尝试使用合并。合并将首先检查实体示例是新的还是已分离的。如果是新的,它将插入;如果是已分离的,它将检索数据并在数据库中更新。
其他选项是确保不在分离的流派示例上调用persist。删除关系上的级联persist设置,并确保在新流派示例上手动调用persist或merge,而不是依赖级联persist设置。

kxxlusnw

kxxlusnw4#

你不能用相同的identifier插入两个元素,这个id**必须是唯一的,否则数据库就不能识别这个对象(哦,讽刺的是),这就是为什么它给你一个例外。
创建一个名为movieId的新字段(或您想给它起的任何名称),并将来自XML的id存储在该字段中,而不是存储在数据库标识符“id“中。

8gsdolmq

8gsdolmq5#

你不能用相同的标识符插入两个对象,它会抛出EntityExistsException异常。
(如果实体已经存在,则在调用持久化操作时可能会抛出EntityExistsException,或者在刷新或提交时抛出EntityExistsException或另一个PersistenceException。)

    • 解决方案**

您可以为movieId创建一个新字段,它将存储来自XML的电影的ID。但这将创建不必要的数据冗余。对于Genre,您应该创建一个新表,在其中定义movie_genreMap。您可以使用一对多Map来实现此目的。

相关问题