我正在修改旧版数据库,必须将一张表分成两张。有很多代码引用我的实体类,因此我想使用@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/