如何使用JPA映射同一超类的实体之间的关系?

时间:2014-08-31 22:08:35

标签: java hibernate jpa

我需要使用JPA / Hibernate建立两个实体之间的关系:ChildFather,两者都扩展了实体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并将其所有属性复制到父和子,为此问题创建解决方案。但我真正的父/子/用户类很复杂,足以避免这样做。

谢谢。

2 个答案:

答案 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;

}