首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate(JPA)重复输入键“主”的“25-9”

Hibernate(JPA)重复输入键“主”的“25-9”
EN

Stack Overflow用户
提问于 2013-03-05 15:32:49
回答 1查看 4K关注 0票数 2

我有一份父母和孩子关系的申请。每个父母都有一组孩子(一对多),每个孩子都有父母(多对一)。在应用程序中,我有一个服务层,在这个层中,我做了以下工作:

代码语言:javascript
复制
  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调用的,它是一个普通的Spring,带有@Transactional注解。当我试图调用addChild()方法时,我得到以下结果:

代码语言:javascript
复制
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似乎已经调用了两次保存!如果我删除“//注意这里的这一行”行,那么所有的操作都很好--实体保存在DB中,我可以看到db中的25-9关系。问题是,在方法的末尾,我有doStuff(父);方法,它对父和其子执行一些操作,所以我不能删除"//注意这里的这一行“行

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

代码语言:javascript
复制
@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;

以下是在父母中声明子女的方式:

代码语言:javascript
复制
@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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-05 17:00:44

在关系中,您似乎忽略了mappedBy参数:

代码语言:javascript
复制
@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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15227767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档