Hibernate上路_16-继承关系映射
2019獨角獸企業重金招聘Python工程師標準>>>
例:員工Employee分為正式工SalaryEmployee和臨時工HourEmployee。子類表的字段都不能使用非空約束。
1.三種繼承關系的建表方式:
1)父類、子類在同一張表,表中有“辨別者列”。通過辨別者列值,區分父類數據和子類數據。
2)父類、子類各一張表。將公共數據放入父表,將個體數據存放子表,子表通過外鍵關聯父表的公共數據。
3)父子類分別建表,父子表無關聯,將父類數據存放到父類表,將子類數據存放子類表?,父子表采用連續增長主鍵?
2.subClass方式:
父子類數據在同一張表,引入辨別者列(discriminator)用來區分數據記錄是父類還是子類。
1)父子類POJO:
2)父類.hbm.xml配置:
對于繼承關系映射,不需要為每個類建立hbm文件。只需要針對父類編寫hbm即可。
3)作為單表操作:
(1)插入:
public void test(){Session session = UtilGetSession.openSession();Transaction transaction = session.beginTransaction();PojoHuman human = new PojoHuman();human.setName("地球人");PojoWoman woman = new PojoWoman();woman.setName("女人");woman.setWaistline(36);woman.setBeauty("漂亮");PojoMan man = new PojoMan();man.setName("男人");man.setHeight(175);man.setSpeed(12);session.save(human);session.save(woman);session.save(man);transaction.commit();session.close();}
(2)查詢,通常使用HQL:
String hqlHuman="from PojoHuman";Query queryHuman = session.createQuery(hqlHuman);List listHuman = queryHuman.list();System.out.println(listHuman);
3.joined-subclass方式:
為每個父類和子類建立單獨數據表,將公共數據放入父表,?將個體信息存入子表,子表通過外鍵與父表關聯。
1)類結構相同:
2)父類.hbm.xml配置:
<hibernate-mapping package="cn.cvu.hibernate.domain"><class name="PojoHuman" table="tb_human" select-before-update="true"><id name="id" column="t_id" type="int"><generator class="native" /></id><!-- 父類的通用屬性 --><property name="name" column="t_name" /><!-- 子類配置name="子類全路徑"table="子類對應的表" --><joined-subclass name="cn.cvu.hibernate.domain.PojoWoman" table="tb_woman"><!-- 子表主鍵,也是關聯父表的外鍵 --><key column="t_human_child"></key><!-- 子類的個體屬性 --><property name="waistline"></property><property name="beauty"></property></joined-subclass><joined-subclass name="cn.cvu.hibernate.domain.PojoMan" table="tb_man"><key column="t_human_child"></key><property name="height"></property><property name="speed"></property></joined-subclass></class> </hibernate-mapping>
3)測試:
(1)測試保存:
代碼同上。
(2)測試查詢:
同上。
(3)測試刪除:?
org.hibernate.engine.jdbc.spi.SqlExceptionHelper?logExceptions?
WARN:?SQL?Error:?1451,?SQLState:?23000?
org.hibernate.engine.jdbc.spi.SqlExceptionHelper?logExceptions?
ERROR:?Cannot?delete?or?update?a?parent?row:?a?foreign?key?constraint?fails?
(`db_hibernate`.`tb_woman`,?CONSTRAINT?`FK_8n9ux8k3f9lja8fldi8om7cg0`?FOREIGN?KEY?
(`t_human_child`)?REFERENCES?`tb_human`?(`t_id`))?
4.union-subclass方式:
父類和子類單獨建表,父表和子表無關聯;父類數據插入父表,子類數據插入子表,父表和子表的主鍵連續自增。
注意:不能使用identity、native,因為需要在多張表完成主鍵連續自增;可以使用sequence(mysql不支持)、?increment?(hibernate實現,max(id)+1)。
1)類結構相同:
2)父類.hbm.xml配置:
<hibernate-mapping package="cn.cvu.hibernate.domain"><class name="PojoHuman" table="tb_human" select-before-update="true"><id name="id" column="t_id" type="int"><generator class="increment" /></id><!-- 父類的通用屬性 --><property name="name" column="t_name" /><!-- 子類配置name="子類全路徑"table="子類對應的表" --><union-subclass name="cn.cvu.hibernate.domain.PojoMan" table="tb_man"><!-- 子類屬性 --><property name="height"/><property name="speed"/></union-subclass><union-subclass name="cn.cvu.hibernate.domain.PojoWoman" table="tb_woman"><property name="waistline"/><property name="beauty"/></union-subclass></class> </hibernate-mapping>
3)測試:
(1)測試保存:
(2)測試查詢:
(3)查詢刪除:
5.建表原則:
如果父子類數據非常簡單,可以使用subclass?,?重點推薦joinedsubclass?(性能最好),不推薦unionsubclass。
- end
?
轉載于:https://my.oschina.net/vigiles/blog/177520
總結
以上是生活随笔為你收集整理的Hibernate上路_16-继承关系映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lync Server 2010迁移至L
- 下一篇: 大话Fragment管理