Hibernate day01
cascade=”none” cascade=”save-update” cascade=”save-update,delete” cascade=”delete”
Usr
Set<Account> 集合元素的改变不会引起数据操作
cascade=”delete-orphan” 可以解决上面的问题,可以删除集合中被删除的元素 [删除孤儿]
继承关系映射
1.父子类关联 -------------------------------- 数据库主外键关联
2.继承映射
1.一个类一个表
父类一个表 -------------主键关联------------------ 子类一个表
这种解决方案非常符合面向对象的思想.支持多态,查询的父类的时候就可以把子类查询出来.
Account 账户 两个子类 DebitAccount CreditAccount
配置如下:就一个配置文件
<!--继承映射配置 将子类的配置写在父类的配置文件中 -->
<joined-subclass name="DebitAccount" table="lilp_debit">
<key column="did"/> //一个类一个,子类表需要通过外键与父类关联
<property name="currency"
column="currency"
not-null="true"/>
</joined-subclass>
<joined-subclass name="CreditAccount" table="lilp_credit">
<key column="cid"/>
<property name="credit"
column="credit"
not-null="true" />
</joined-subclass>
2.所有类一张表
使用一张表把所有的字段都放进去,这种解决方案的缺点,需要加一个辨别类型的字段,
降了主键的每个字段必须允许为空 优点:支持多态,字段比较少时,操作比较方便,效率较高
配置如下:
<!--子类类型字段 -->
<!--需要配置一个类型字段 --> //这个字段标记每条账户记录的类型,是信用账户还中普通账户
<discriminator column="TYPE"/>
<subclass name="DebitAccount"
discriminator-value="D">
<property name="currency"
column="currency"/>
</subclass>
<subclass name="CreditAccount"
discriminator-value="C">
<property name="credit"
column="credit"/>
</subclass>
3.一个实体类一上表 父类不要表, 为子类建表
解决方案缺点:不支持多态查询 对继承关系映射不是很完整
<!--一个实体一个表 -->
<union-subclass name="DebitAccount" table="lilp_debit1">
<property name="currency"
column="currency"
not-null="true"/>
</union-subclass>
<union-subclass name="CreditAccount" table="lilp_credit1">
<property name="credit"
column="credit"
not-null="true"/>
</union-subclass>
使用原则:看总字段数据多少,如果较少,可以采用所有类一个表的解决方案 [简单 查询效率高]