Hibernate(JPA)重复输入';25-9';对于键';初级';
我有一个与亲子关系有关的应用程序。每个父对象都有一组子对象(一对多),每个子对象都有一个父对象(多对一)。 在应用程序中,我有一个服务层,在该层中我基本上执行以下操作:Hibernate(JPA)重复输入';25-9';对于键';初级';,jpa,duplicates,parent,many-to-one,Jpa,Duplicates,Parent,Many To One,我有一个与亲子关系有关的应用程序。每个父对象都有一组子对象(一对多),每个子对象都有一个父对象(多对一)。 在应用程序中,我有一个服务层,在该层中我基本上执行以下操作: public void addChild() { parent = getParentFromDB(); Child child = new Child(); child.setParent(parent); saveChild(child); Set&l
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);
}
我确实在hibernate中打开了SQL日志,似乎hibernate调用了save两次!!!如果我删除“//注意这里的这一行”这一行,一切都正常-实体保存在数据库中,我可以在数据库中看到25-9关系。问题是,在方法的末尾,我有doStuff(父级);方法,该方法对父级及其子级执行一些操作,因此我无法删除“//注意这里的这一行”行
编辑:
这是在子对象中声明父对象的方式:
@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;
@OneToMany(fetch=FetchType.LAZY,targetEntity=ChildModel.class,cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REMOVE})
@JoinTable(name=“PARENT\u CHILDREN”,joinColumns=@JoinColumn(name=“PARENT\u ID”),inverseJoinColumns=@JoinColumn(name=“CHILD\u ID”))
私人儿童;
您似乎只是缺少关系中的参数:
@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;
@OneToMany(mappedBy=“parent”,fetch=FetchType.LAZY,targetEntity=ChildModel.class,cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REMOVE})
@JoinTable(name=“PARENT\u CHILDREN”,joinColumns=@JoinColumn(name=“PARENT\u ID”),inverseJoinColumns=@JoinColumn(name=“CHILD\u ID”))
私人儿童;
请发布父项和子项的关系定义。如果在持久化依赖实体时出现配置错误。您可以发布父级和子级的映射吗?如果我添加mappedBy参数,我会在启动时出现此异常:由:org.hibernate.AnnotationException引起:标记为mappedBy的关联不能定义像\@JoinTable或@jointcolumn:xxxx.ParentModel.children这样的数据库映射,那么删除JoinTable呢我会接受你的回答。它实现了我所追求的,尽管它以不同的方式实现。最后的配置是:@ManyToOne(fetch=FetchType.EAGER,targetEntity=ParentModel.class,cascade={CascadeType.REMOVE})@JoinColumn(name=“PARENT\u ID”,nullable=true,referencedColumnName=“PK”)private ParentModel PARENT;和@OneToMany(mappedBy=“parent”,fetch=FetchType.LAZY,targetEntity=ChildrenModel.class,cascade={CascadeType.REMOVE})私有集子级@ben75我有一个类似的问题。你愿意帮我吗?以下是链接:
@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;