1)我们不应该在乎hibernate中的表(父/子)。你应该做的是用Java实现你的软件设计(面向对象的方法),休眠将按照你的软件/项目设计来完成它的工作。
你的项目的设计不应该有像hibernate这样的任何API的实现依赖。
例如:让你的设计说你有,你想实现一个场景的是,一个关系(继承),如“有两种员工在公司定期和合同工“。
这种情况可以在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是最近的一个。以解决许多现实世界的问题。请记住,所有关系(@OneToMany,@OneToOne,@ManyToMany,@ManyToOne等)都是面向对象的方法来解决特定的现实世界问题。
因此,一旦创建了用于实现这些关系的java类&,您想要使用ORM将对象保存为数据库,您只需保持该关系,并根据ORM框架执行相应的映射。
在执行hibernate时,您不应该更改或决定父/子表是什么。这是在实现你的java类之前决定的。
3)因此,拇指规则是依赖于您的项目设计/要求,而不是在hibernate中的实现。
为了实现设计,应该更改/(添加新的)后端api。这是因为,一个好的软件设计并不依赖于它的底层实现。
4)数据库设计应根据USE-CASE的设计方式来完成。在用例图中,您为实例定义了实体之间的所有关系。
建议:只要充分利用ORM框架,以实现您的要求。
让设计师完成他们的工作,然后开发人员按照设计师的要求实施设计。