在单个类上休眠不同类型的一对一关系

时间:2012-05-15 14:50:11

标签: java hibernate jpa

我试图找出在休眠中完成关系的最佳方法。我有一个Customer对象。每个客户都有技术联系人,计费联系人和销售联系人。每种类型的联系人都具有完全相同的数据结构(电话,电子邮件,地址等)。

我的第一个想法是创建一个Contact表,然后在Customer表中有三列 - sales_contact,billing_contact,technical_contact。这将在相同的两个表之间产生三个不同的外键一对一关系。但是,我发现在Hibernate中很难映射,至少使用注释。

另一个想法是使它成为多对多的关系,并在映射表中有一个类型标志。因此,任何客户都可以拥有多个联系人(在这种情况下不超过三个),任何联系人都可以属于多个客户。不过,我不知道如何映射那个。 tere是地图表上的类型字段吗?此属性是否会显示在Contact java模型对象上? Customer模型是否具有一组Contact对象。或三个不同的个人联系对象?

所以我在这里寻找两件事 - 1.在数据库中实现这一点的最佳方法是什么,以及2.如何使用注释制作Hibernate映射?

2 个答案:

答案 0 :(得分:1)

可以这么简单:

@Entity
public class Contact {
    @Id
    private String id;
    private String phome;
    private String email;
    private String address;

    // ... Getters and Setters
}

@Entity
public class Customer {

    @Id
    @GeneratedValue
    private String id;

    @ManyToOne
    @JoinColumn(name = "ID")
    private Contact billingContact;

    @ManyToOne
    @JoinColumn(name = "ID")
    private Contact salesContact;

    @ManyToOne
    @JoinColumn(name = "ID")
    private Contact technicalContact;

    public Customer() {
    }

    // ... Getters and Setters
}

现在,如果您想在对象级别区分 BillingContact SalesContact ,可以使联系抽象,并与每种联系人一起实施。您必须使用@Inheritance注释父类以指定您选择的继承策略(此处适用于SINGLE_TABLE,它将使用技术鉴别器列 - 请参阅http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168)。

答案 1 :(得分:0)

如何使用@OneToOne并为每种类型命名@JoinColumn:

@Entity
public class Contact {
     @Id
     private String id;

     private String phone;
     private String email;
     private String address;

     // ... Getters and Setters
}

@Entity
public class Customer {
    @Id
    @GeneratedValue
    private String id;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="billingContact_ID")
    private Contact billingContact;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="salesContact_ID")
    private Contact salesContact;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="technicalContact_ID")
    private Contact technicalContact;

    public Customer() {
    }

    // ....
}

对于Customer表中的每一行,应在Contact表中创建三行