1) 我们不应该关心休眠中的表(父/子)。您应该做的是用 Java(面向对象的方法)实现您的软件设计,hibernate 将根据您的软件/项目设计完成它的工作。
您的项目设计不应该对任何 API 有任何实现依赖像休眠一样。
例如: 假设在您的设计中,您有一个场景想要实现 is-a 关系(继承),例如“有两种员工在公司担任正式员工和合同工。”
这个场景可以用java实现如下:
class Employee {
private int id; //applicable for both types of employees
private String name; //applicable for both types of employees
//getters and setters
}
class Contract_Employee extends Employee{
private float pay_per_hour;
private String contract_duration;
//getters and setters
}
class Regular_Employee extends Employee{
private float salary;
private int bonus;
//getters and setters
}
它与hibernate的映射如下:
<hibernate-mapping>
<class name="com.stack.Employee" table="emp" discriminator-value="emp">
<id name="id">
<generator class="increment"></generator>
</id>
<discriminator column="type" type="string"></discriminator>
<property name="name"></property>
<subclass name="com.stack.Regular_Employee" discriminator-value="regular_emp">
<property name="salary"></property>
<property name="bonus"></property>
</subclass>
<subclass name="com.stack.Contract_Employee" discriminator-value="contract_emp">
<property name="pay_per_hour"></property>
<property name="contract_duration"></property>
</subclass>
</class>
</hibernate-mapping>
由于 Hibernate 是 ORM 框架,它支持这种关系,它必须这样做。 hibernate 框架有很多发展,目前 5.x 是最近的一个。从而解决许多现实世界的问题。
2) 请记住,所有关系(@OneToMany、@OneToOne、@ManyToMany、@ManyToOne 等)都是解决特定现实世界问题的面向对象方法。
因此,一旦您创建了用于实现这些关系的 Java 类,并且您希望使用 ORM 将对象原样存储在数据库中,您只需要保持关系原样并按照 ORM 框架进行相应的映射。
在实现休眠时,您不应更改或决定父/子表。这是在实现您的 java 类之前决定的。
3) 因此,经验法则是依赖于您的项目设计/需求,而不是它在休眠中的实现。
应该更改/(添加新的)后端 api 以实现设计。这是因为,一个好的软件设计并不依赖于它的底层实现。
4) 数据库设计应基于用例的设计方式。在用例图中,实体之间的所有关系都是针对场景定义的。
建议:好好利用ORM框架,实现你的需求。
让设计人员完成他们的工作,开发人员按照设计人员的意愿实施设计。