jpa - Hibernate(JPA) key '25-9' 的重复条目 'PRIMARY'

标签 jpa duplicates parent many-to-one

我有一个具有父子关系的应用程序。每个 parent 都有一组 child (一对多),每个 child 都有一个 parent (多对一)。 在应用程序中,我有一个服务层,在那里我几乎执行以下操作:

  public void addChild() {
       parent = getParentFromDB();
       Child child = new Child();
       child.setParent(parent);
       saveChild(child);
       Set<Child> children = new HashSet<Child>();
       children.addAll(parent.getChildren());
       children.add(child);

       parent.setChildren(children); // notice this line here.

       saveParent(parent);
       doStuff(parent);
    }

服务层是从 Facade 调用的,Facade 是一个带有 @Transactional 注释的常规 Spring bean。当我尝试调用 addChild() 方法时,我得到以下结果:

2013-03-05 17:09:50,195 [qtp511931089-83] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1062, SQLState: 23000
2013-03-05 17:09:50,196 [qtp511931089-83] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Duplicate entry '25-9' for key 'PRIMARY'
2013-03-05 17:09:50,198 [qtp511931089-83] ERROR org.hibernate.engine.jdbc.batch.internal.BatchingBatch - HHH000315: Exception executing batch [Duplicate entry '25-9' for key 'PRIMARY']
2013-03-05 17:09:50.204:WARN:oejs.ServletHandler:/child/add
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Duplicate entry '25-9' for key 'PRIMARY'
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1306)

我确实在hibernate中打开了SQL日志,看来hibernate调用了save两次!如果我删除“//notice this line here”行,一切正常 - 实体保存在数据库中,我可以在数据库中看到 25-9 关系。问题是在方法的最后我有 doStuff(parent);方法对父级及其子级执行一些操作,因此我无法删除“//notice this line here”行

编辑: 这是在子级中声明父级的方式:

@ManyToOne(fetch = FetchType.EAGER, targetEntity = ParentModel.class, cascade = { CascadeType.REMOVE })
@JoinTable(name = "PARENT_CHILDREN", joinColumns = @JoinColumn(name = "CHILD_ID"), inverseJoinColumns = @JoinColumn(name = "PARENT_ID"))
private ParentModel parent;

这是在父级中声明子级的方式:

@OneToMany(fetch = FetchType.LAZY, targetEntity = ChildModel.class, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
@JoinTable(name = "PARENT_CHILDREN", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private Set<ChildModel> children;

最佳答案

看来您只是错过了 mappedBy关系中的参数:

@OneToMany(mappedBy="parent", fetch = FetchType.LAZY, targetEntity = ChildModel.class, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
@JoinTable(name = "PARENT_CHILDREN", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID"))
private Set<ChildModel> children;

关于jpa - Hibernate(JPA) key '25-9' 的重复条目 'PRIMARY',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15227767/

相关文章:

hibernate - 总部内的HQL订单

regex - 在 Notepad++ 中删除重复的字符串

python - 删除字符串中连续字符重复数据的最快方法 - Python

c++ - 将对父对象的引用传递给需要子对象的函数

javascript - 每次在 jQuery 中单击按钮(子)时,如何删除选定的 <tr>(父)div?

java - Hibernate:如何定义映射值列名称?

java - 为什么我的 ConstraintViolationException 没有被捕获?

java - JPA中的协调类型有什么用?

php - 不间断的cronjob

ios - 调用另一个 View Controller 的 func 来控制 alpha 返回 nil 错误