【问题标题】:hibernate different types of one-to-one relationships on a single class在单个类上休眠不同类型的一对一关系
【发布时间】:2023-04-06 18:51:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么你觉得很难映射? @JoinColumn 肯定会粉碎这个吗?
  • 如果列在相关表上的名称不同,@JoinColumn 是否有效?在 Customer 中,列名将是“sales_contact_id”,而在 Contact 中,列名将是“contact_id”——如果我使用 @JoinColumn(name="sales_contact_id") 进行注释,Hibernate 会知道将其映射到“contact_id”吗?跨度>
  • 当然,前提是 Contact 或任何它自己的表。
  • 果然 - 我猜我有点超前了。谢谢!

标签: java hibernate jpa


【解决方案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,可以将 Contact 抽象化,并在每种类型的联系人中实现它。您必须使用 @Inheritance 注释父类以指定您选择的继承策略(SINGLE_TABLE 在这里听起来很合适,它将使用技术鉴别器列 - 请参阅 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168)。

【讨论】:

    【解决方案2】:

    如何使用@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 表中创建三行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多