2

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

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

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

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

4

2 回答 2

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
}

现在,如果您想在对象级别区分BillingContactSalesContact,可以将Contact抽象化,并使用每种类型的联系人实现它。您必须使用注释父类@Inheritance以指定您选择的继承策略(SINGLE_TABLE 在这里听起来很合适,它将使用技术鉴别器列 - 请参阅http://docs.jboss.org/hibernate/annotations/3.5/reference/ zh/html_single/#d0e1168)。

于 2012-05-15T15:26:43.277 回答
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 表中创建三行

于 2015-06-11T18:34:26.717 回答