日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate上路_16-继承关系映射

發布時間:2023/12/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate上路_16-继承关系映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

例:員工Employee分為正式工SalaryEmployee和臨時工HourEmployee。子類表的字段都不能使用非空約束。

1.三種繼承關系的建表方式:

1)父類、子類在同一張表,表中有“辨別者列”。通過辨別者列值,區分父類數據和子類數據。
2)父類、子類各一張表。將公共數據放入父表,將個體數據存放子表,子表通過外鍵關聯父表的公共數據。
3)父子類分別建表,父子表無關聯,將父類數據存放到父類表,將子類數據存放子類表?,父子表采用連續增長主鍵?

2.subClass方式:

父子類數據在同一張表,引入辨別者列(discriminator)用來區分數據記錄是父類還是子類。

1)父子類POJO:


2)父類.hbm.xml配置:

對于繼承關系映射,不需要為每個類建立hbm文件。只需要針對父類編寫hbm即可。

<hibernate-mapping package="cn.cvu.hibernate.domain"><!-- 0.父類、子類都要配置辨別值,將在辨別者列中存儲 --><class name="PojoHuman" table="tb_human" select-before-update="true" discriminator-value="human"><id name="id" column="t_id" type="int"><generator class="native" /></id><!-- 1.首先配置辨別者列! column="自定義列名"type="自定義類型" --><discriminator column="t_disc" type="string"/><!-- 2.然后配置父類的通用屬性! --><property name="name" column="t_name" /><!-- 3.最后配置子類關系 name="子類全路徑" --><subclass name="cn.cvu.hibernate.domain.PojoWoman" discriminator-value="woman"><!-- 子類的個體屬性 --><property name="waistline"/><property name="beauty"/></subclass><subclass name="cn.cvu.hibernate.domain.PojoMan" discriminator-value="man"><property name="height"/><property name="beauty"/></subclass></class> </hibernate-mapping>


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)測試刪除:?

PojoHuman human = new PojoHuman();human.setId(2); //父類托管對象session.delete(human);

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-继承关系映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。