我目前面临的问题如下:
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表中?
5条答案
按热度按时间m1m5dgzv1#
你的体裁Map似乎有一个错误的关系。从你的用例来看,我认为它应该是一个多对多的关系。
流派的有效Map应如下所示:
jv2fixgn2#
在我的案例中,我使用了手动事务管理,这需要更多的手动操作。
clear()
会分离实体管理器中可能存在于先前插入中的任何剩余实体,即使数据库在此之后已被清除。tp5buhyn3#
要么直接在Genre示例上调用persist,要么在movie上调用persist,movie-〉GenreMap有级联persist,JPA要求提供者在分离实体上调用persist时抛出异常,因为persist意味着希望提供者插入它。并且因为它已经存在而被分离。2所以你会得到一个异常。3听起来你的解析器不能分辨出类型实体是同一个示例,创建同一数据的多个示例也是如此。如果无法解决此问题,您可以尝试使用合并。合并将首先检查实体示例是新的还是已分离的。如果是新的,它将插入;如果是已分离的,它将检索数据并在数据库中更新。
其他选项是确保不在分离的流派示例上调用persist。删除关系上的级联persist设置,并确保在新流派示例上手动调用persist或merge,而不是依赖级联persist设置。
kxxlusnw4#
你不能用相同的identifier插入两个元素,这个id**必须是唯一的,否则数据库就不能识别这个对象(哦,讽刺的是),这就是为什么它给你一个例外。
创建一个名为
movieId
的新字段(或您想给它起的任何名称),并将来自XML的id
存储在该字段中,而不是存储在数据库标识符“id
“中。8gsdolmq5#
你不能用相同的标识符插入两个对象,它会抛出EntityExistsException异常。
(如果实体已经存在,则在调用持久化操作时可能会抛出
EntityExistsException
,或者在刷新或提交时抛出EntityExistsException
或另一个PersistenceException
。)您可以为movieId创建一个新字段,它将存储来自XML的电影的ID。但这将创建不必要的数据冗余。对于Genre,您应该创建一个新表,在其中定义movie_genreMap。您可以使用一对多Map来实现此目的。