我试图找出在休眠中完成关系的最佳方法。我有一个Customer对象。每个客户都有技术联系人,计费联系人和销售联系人。每种类型的联系人都具有完全相同的数据结构(电话,电子邮件,地址等)。
我的第一个想法是创建一个Contact表,然后在Customer表中有三列 - sales_contact,billing_contact,technical_contact。这将在相同的两个表之间产生三个不同的外键一对一关系。但是,我发现在Hibernate中很难映射,至少使用注释。
另一个想法是使它成为多对多的关系,并在映射表中有一个类型标志。因此,任何客户都可以拥有多个联系人(在这种情况下不超过三个),任何联系人都可以属于多个客户。不过,我不知道如何映射那个。 tere是地图表上的类型字段吗?此属性是否会显示在Contact java模型对象上? Customer模型是否具有一组Contact对象。或三个不同的个人联系对象?
所以我在这里寻找两件事 - 1.在数据库中实现这一点的最佳方法是什么,以及2.如何使用注释制作Hibernate映射?
答案 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表中创建三行