我需要使用JPA / Hibernate建立两个实体之间的关系:Child
和Father
,两者都扩展了实体User
。一个父亲可以没有孩子,每个孩子都必须有一个父亲。我可以插入一个没有问题的父亲,但是不能添加属于我之前插入的父亲的孩子。以下是我添加孩子的方法:
SelectStatement ss = new SelectStatement();
ss.manager.clear();
Father father = ss.getFather(socialId);
Child child = new Child();
//Set some parameters
dependente.setFather(father);
titular.addChild(child);
ss.manager.refresh(titular);
ss.manager.persist(dependente);
ss.manager.getTransaction().begin();
try{
ss.manager.getTransaction().commit();
ss.close();
return true;
}
catch(RollbackException e){
ss.close();
return false;
}
班级用户:
@Entity
@Inheritance ( strategy = InheritanceType.JOINED )
public class User{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int pk_user;
@Column
private String name;
}
父亲类:
@Entity
public class Father extends User{
@OneToMany(mappedBy="father")
@LazyCollection(LazyCollectionOption.FALSE)
private Collection <Child> childs;
@Column(nullable=true, unique=true)
private String social_id;
public void addChild(Child child){
this.childs.add(child);
}
}
班级儿童:
@Entity
public class Child extends User{
//Here is the problem!
@ManyToOne(optional = false)
@JoinColumn(name = "pk_user")
private Father father;
}
PS:为了清晰起见,我删除/更改了一些属性,所以不要担心不存在的get / set方法等。
以下代码产生错误&#34;应使用insertable = false,updatable = false&#34;。如果我使用,我会收到错误&#34;无法添加或更新子行&#34;。
我可以删除类User并将其所有属性复制到父和子,为此问题创建解决方案。但我真正的父/子/用户类很复杂,足以避免这样做。
谢谢。
答案 0 :(得分:1)
我有类似的代码,它对我来说很好(我在JTA环境中):
create Father;
em.persist(fatherInstance);
em.flush(); //(with this I become assured, that the father is present in database )
create child;
em.persist(childInstance);
em.flush();
你是否真的需要能够懒惰加载你孩子的名义字段?如果需要,我想更好的方法是使用@JoinColumn(nullable=false)
。
但是为了更好地理解问题 - 最好看一下确切的代码。
答案 1 :(得分:0)
我发现了问题。我在2列中使用了相同的列名。现在在Child表中,对于每个孩子,我有一个pk_user
指向超类,而“pk_father”指向孩子的父亲。
@Entity
public class Child extends User{
//name has to be != then pk_user
@ManyToOne(optional = false)
@JoinColumn(name = "pk_father")
private Father father;
}