Java JPA中的人与儿童关系,其中儿童也是人

Java JPA中的人与儿童关系,其中儿童也是人,java,hibernate,jpa,Java,Hibernate,Jpa,在JPA中,是否有任何方法可以模拟以下类型的关系 PERSON INT id PKEY VARCHAR name CHILD INT parentId FKEY(PERSON->id) INT nameId FKEY(PERSON->id) 人 INT-id-PKEY VARCHAR名称 小孩 INT parentId FKEY(个人->id) INT nameId FKEY(个人->id) 其中,parentId是多对一关系,nameId是一对一关系。所以,本质上,p

在JPA中,是否有任何方法可以模拟以下类型的关系

PERSON INT id PKEY VARCHAR name CHILD INT parentId FKEY(PERSON->id) INT nameId FKEY(PERSON->id) 人 INT-id-PKEY VARCHAR名称 小孩 INT parentId FKEY(个人->id) INT nameId FKEY(个人->id) 其中,
parentId
是多对一关系,
nameId
是一对一关系。所以,本质上,
parentId
nameId
将在CHILD中创建一个复合主键


谢谢

我会将
nameId
重命名为
childId
。从逻辑上讲,你在一个人和他的孩子之间有一种关系。每个孩子都是一个人。对于您当前拥有的模型,没有理由拥有单独的
子表
,但我们假设您稍后将添加不同的属性。我将使用继承和聚合对关系进行建模:

@Entity
@Table(name="PERSON")
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Serializable {
    @Id
    private Integer id;

    private String name;

    @OneToMany(mappedBy = "parent")
    private List<Child> children;
}

@Entity
@Table(name="CHILD")
@PrimaryKeyJoinColumn(name="nameId", referencedColumnName = "id")
private class Child extends Person implements Serializable {
    @ManyToOne
    @JoinColumn(name = "parentId", referencedColumnName = "id")
    private Person parent;
}
@实体
@表(name=“PERSON”)
@继承(策略=InheritanceType.JOINED)
公共类Person实现可序列化{
@身份证
私有整数id;
私有字符串名称;
@OneToMany(mappedBy=“家长”)
私人名单儿童;
}
@实体
@表(name=“CHILD”)
@PrimaryKeyJoinColumn(name=“nameId”,referencedColumnName=“id”)
私有类子扩展Person实现可序列化{
@许多酮
@JoinColumn(name=“parentId”,referencedColumnName=“id”)
私人家长;
}

这是示例代码,逐字输入,您必须自己进行错误检查。但这是一个起点。

您可以为您的场景创建一个实体。但是表的设计应该是nameId,它应该是子表的主键,如果您在创建实体类时遇到困难,那么在NetBeans IDE或Eclipse IDE中,有一个选项“entity class from table”用于创建实体类。

Yeah,实际关系更类似于User和Contact,Contact具有User中没有的额外属性。这个很好用,谢谢!