gpt4 book ai didi

java - 如何使用 JPA 映射同一父类(super class)的实体之间的关系?

转载 作者:行者123 更新时间:2023-12-01 12:35:54 25 4
gpt4 key购买 nike

我需要使用 JPA/Hibernate 在两个实体之间建立关系:ChildFather,两者都扩展了实体 User。一个父亲可以没有到n个 child ,而每个 child 都必须有一个父亲。我可以毫无问题地插入父亲,但无法添加属于我之前插入的父亲的 child 。这是我添加 child 的方法:

    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;
}

类(class)用户:

   @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);
}
}

类(class) child :

@Entity
public class Child extends User{

//Here is the problem!
@ManyToOne(optional = false)
@JoinColumn(name = "pk_user")
private Father father;

}

PS:为了清楚起见,我删除/更改了一些属性,所以不要担心不存在的 get/set 方法等。

以下代码产生错误“应该使用 insertable = false, updatable = false”。如果我确实使用,我会收到错误“无法添加或更新子行”。

我可以删除 User 类并将其所有属性复制到 Father 和 Child,从而创建此问题的解决方案。但我真正的父亲/ child /用户类足够复杂,可以避免这样做。

谢谢。

最佳答案

我有类似的代码,它对我来说工作得很好(我在 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();

你真的需要延迟加载你的 child 的名义字段的能力吗?,如果需要,我想最好使用@JoinColumn(nullable=false)

但是为了更好地理解问题 - 最好看到确切的代码。

关于java - 如何使用 JPA 映射同一父类(super class)的实体之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25596746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com