如何定义指定关系类型的多对多关系?

时间:2012-06-08 02:31:37

标签: mysql hibernate relational-database

我正在使用Hibernate和MySql(两者的旧版本 - Seam 2项目)。

我无法弄清楚如何设置我的映射表和实体注释,以便我可以“着色”两个实体之间的关系类型(好像我在图上着色边缘)。这是我的架构的近似值:

客户

  • ID
  • 全名
  • phoneNumber的

商品

  • ID
  • BRANCHNAME
  • addressFirstLine
  • addressSecondLine

customer_store

  • CUSTOMER_ID
  • STORE_ID
  • customertype

customertype

  • value(枚举:个人,公司,内部)

设计我的Hibernate注释和模式以正确映射这些关系的最佳方法是什么?

我看过的方法:

  1. 我觉得我可以在Set<Store>对象上有三个Customer属性,每个CustomerType一个属性,或一个Set<Store> getStores(CustomerType)方法。我不知道如何制作这个映射,而且我很难找到这个特定场景的文档。
  2. 我可以更改我的架构,以便按customertypecustomer_store_individualcustomer_store_corporate等方式设置表格。这感觉多余,但它可以解决问题。我宁愿让hibernate做一些魔术来整理这个映射,并将它们组合到一个表中。
  3. 我可以为customer_store表创建一个实体。这感觉就像一个非常糟糕的解决方案。 This answer already covers this type of relationship,虽然我不喜欢这个解决方案。
  4. 请注意,我正在尝试对我的域进行模糊处理,因此请避免就客户或存储对象本身提出建议。让我们假设我的域对象被正确分解,并且它们确实是多对多的关系。它只是区分我遇到问题的每个链接的类型:)

1 个答案:

答案 0 :(得分:0)

我不知道它是否是最佳解决方案,但我会使用关系的值对象

@Entity
public class Customer
{
    // to get all stores
    @ElementCollection
    public Set<StoreCustomer> stores;

    // to get specific stores
    public Set<Store> getStores(CustomerType);
}

@Entity
public class Store
{
    // to get all customers
    @ElementCollection
    public Set<StoreCustomer> customers;

    // to get specific customers
    public Set<Customer> getCustomers(CustomerType);
}

@Embeddable
public class StoreCustomer
{
    @ManyToOne
    public Customer customer;

    @ManyToOne
    public Store store;

    public CustomerType type;
}