我正在修改旧版数据库,必须将一张表分成两张。有很多代码引用我的实体类,因此我想使用@SecondaryTable避免使所有项目陷入混乱。

假设我有一个这样的Employee表:

+---------------+
|Employee       |
|---------------+
|employee_id    |(pk)(ai)
|first_name     |
|last_name      |
|email_personal |
|email_work     |
+---------------+


但是现在每个员工可以拥有3、4或5个电子邮件地址,因此,我们不想在Employee表中添加更多列,而是希望将它们带到一个称为Email_Address的单独表中,如下所示:

+-----------------+
|Email_Address    |
|-----------------+
|email_address_id | (pk)(ai)
|employee_id      | (fk)
|email_address    |
|description      |
+-----------------+


因此,曾经是这样的寄存器:

+---------------+---------------+---------------+-------------------+---------------+
|  employee_id  |  first_name   |  last_name    |   email_personal  |  email_work   |
|---------------+---------------+---------------+-------------------+---------------+
|       1       |      John     |      Locke    | [email protected] | [email protected] |
+---------------+---------------+---------------+-------------------+---------------+


现在是这样的:

+---------------+---------------+---------------+
|  employee_id  |  first_name   |   last_name   |
|---------------+---------------+---------------+
|       1       |      John     |      Locke    |
+---------------+---------------+---------------+

+--------------------+---------------+-------------------+-------------------+
|  email_address_id  |  employee_id  |   email_address   |    description    |
|--------------------+---------------+-------------------+-------------------+
|       1            |       1       | [email protected] |      Personal     |
+--------------------+---------------+-------------------+-------------------+
|       2            |       1       |   [email protected]   |        Work       |
+--------------------+---------------+-------------------+-------------------+


最后是我的问题:如果我当前的实体类是这样的话,我可以使用@SecondaryTable解决此问题吗:

@Entity
@Table(name = "Employee")
public class Employee implements java.io.Serializable {

  @Id
  @Column(name = "employee_id")
  private Integer patientId;

  @Column(name = "first_name")
  private String firstName;

  @Column(name = "last_name")
  private String lastName;

  @Column(name = "email_personal")
  private String emailPersonal;

  @Column(name = "email_work")
  private String emailWork;

  .
  .
  .
}

最佳答案

@SecondaryTable仅在主要和次要之间具有一对一关系时才起作用。基本上,您声明您的1个对象存储在2个(或更多)表中。它是@Embeddable的补充,表示您的2个(或更多)对象存储在1个表中。

如果您要重构旧代码并且不想处理地址从1变为多个的所有实例,则可以将地址标记为“ home”或“ primary”,并让“ getAddress()”返回该home或主要,它曾经这样做。您将创建另一个名为getAllAddresses()的getter(如果使用getter定义,请确保将其标记为@Transient),该getAllAddresses()将返回List或Set的定义。

TL; DR-否,@ SecondaryTable无法使用,请使用@OneToMany ...

关于java - Hibernate上与@SecondaryTable的多对一​​关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21271366/

10-09 04:55