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

时间:2012-12-17 15:58:21

标签: java hibernate jpa

在JPA中有什么方法可以模拟以下类型的关系吗?

PERSON
   INT id PKEY
   VARCHAR name

CHILD
   INT parentId FKEY(PERSON->id)
   INT nameId FKEY(PERSON->id)

parentId是多对一关系,nameId是一对一的关系。那么,基本上parentIdnameId会在CHILD中创建复合主键吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我会将nameId重命名为childId。从逻辑上讲,你与一个人及其子女之间存在关系。每个孩子本身就是一个人。使用您目前拥有的模型,没有理由拥有单独的child表,但我们假设您稍后会添加不同的属性。我会使用继承和聚合来建模关系:

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

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

答案 1 :(得分:0)

您可以为您的方案创建实体。但表设计应该是nameId应该是子表的主键,如果您在创建实体类时遇到问题,那么在NetBeans IDE或Eclipse IDE中,可以选择“实体类来自表”来创建实体类。