Hibernate關聯關係映射之繼承映射,hibernate關聯
首先有一個文章類(Article)類中有id、title、content、postTime等屬性。
package entity;import java.util.Date;public class Article {private Integer id;private String title;private String content;private Date postTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Date getPostTime() {return postTime;}public void setPostTime(Date postTime) {this.postTime = postTime;}}
然後看他的子類,Topic類和Reply類。他們除了父類的屬性外還有自己獨特的屬性。
package entity;public class Topic extends Article{private int type;public int getType() {return type;}public void setType(int type) {this.type = type;}}
package entity;public class Reply extends Article{private int floor;public int getFloor() {return floor;}public void setFloor(int floor) {this.floor = floor;}}
繼承映射的方式有三種方式,我們一個個看:
方式一:將父類和子類的資訊存放在同一個表中,然後在該資料表中有個欄位用來表示該條記錄的類型,其中子類專屬的屬性允許為空白。我們看一下映射設定檔。
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="entity"> <class name="entity.Article" table="article" schema="MYHR" discriminator-value="Article"> <id name="id" type="int"> <column name="ID" /> <generator class="assigned" /> </id> <!-- 用於鑒別是什麼類型的一個列 --> <discriminator type="string" column="t_class"/> <property name="title"/> <property name="content" type="clob" length="5000"/> <property name="postTime" type="timestamp"/> <subclass name="Topic" discriminator-value="Topic"> <property name="type" type="int"/> </subclass> <subclass name="Reply" discriminator-value="Reply"> <property name="floor" type="int"/> </subclass> </class></hibernate-mapping>
方式二:父類和子類不在同一張表中,且每一個類一張表,抽象類別對應一張表,這是配置子類使用joined-subclass
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="entity"><class name="entity.Article" table="article" schema="MYHR"><id name="id" type="int"><column name="ID" /><generator class="assigned" /></id><property name="title" /><property name="content" type="clob" length="5000" /><property name="postTime" type="timestamp" /><joined-subclass name="Topic" table="topic"><key column="id" /><property name="type" type="int" /></joined-subclass><joined-subclass name="Reply" table="reply"><key column="id" /><property name="floor" type="int" /></joined-subclass></class></hibernate-mapping>
方式三:每一個類單獨一張表,並且抽象類別不對應一張表,子類對應的資料庫表中對應全部的屬性,包括從父類繼承的資訊。
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="entity"> <!-- 採用每個具體類一張表,抽象類別不對應表,abstract預設為false,設為true表示為抽象的不對應表 --><class name="entity.Article" abstract="true" schema="MYHR"><id name="id" type="int"><column name="ID" /><generator class="assigned" /></id><property name="title" /><property name="content" type="clob" length="5000" /><property name="postTime" type="timestamp" /><union-subclass name="Topic" table="topic"><property name="type" type="int" /></union-subclass><union-subclass name="Reply" table="reply"><property name="floor" type="int" /></union-subclass></class></hibernate-mapping>
然後看一下測試類別,三種方式測試類別相同,只有方式三的save方法中因為抽象類別沒有單獨的資料表因此不能儲存他們父類的資訊。
package test;import org.hibernate.Session;import org.hibernate.Transaction;import entity.Article;import entity.Reply;import entity.Topic;import factory.HibernateSessionFactory;public class Test {private Session session = null;private Transaction tran = null;@org.junit.Testpublic void save() {session = HibernateSessionFactory.getSession();tran = session.beginTransaction();try{Article article = new Article();article.setId(1);article.setTitle("這是一個Article");Topic topic = new Topic();topic.setId(2);topic.setTitle("這是一個Topic");Reply reply = new Reply();reply.setId(3);reply.setTitle("這是一個reply");session.save(article);session.save(topic);session.save(reply);tran.commit();}catch(Exception e){tran.rollback();}}@org.junit.Testpublic void Get() {session = HibernateSessionFactory.getSession();tran = session.beginTransaction();try{Article a = (Article)session.get(Article.class, 1);Topic t = (Topic)session.get(Topic.class, 2);Reply r = (Reply)session.get(Reply.class, 3);System.out.println(a.getTitle());System.out.println(t.getTitle());System.out.println(r.getTitle());tran.commit();}catch(Exception e){tran.rollback();}}}
hibernate中繼承關係映射
首先外鍵裡主鍵的實體要自己手動的再後面初始化(new 主鍵實體())
配置裡省事就在 <many-to-one >和<set>的屬性裡加上 fetch="join"
還有就是只有通過hibernate裡主鍵尋找hibernate才會自動給外鍵裡的實體,主鍵裡的集合賦值
hibernate關係映射與繼承怎實現?是怎的概念?
*1)父類和子類都有對應的表,使用<joined-subclass>定義繼承關係,使用步驟如下
a.將父表和子表產生單表的基本映射
b.將子類添加extends父類
c.利用<joined-subclass>定義子類映射
從Hibernate3.0版本開始,可以將<joined-subclass>單獨取出,放到一個hbm.xml中定義.格式如下
<hibernate-mapping>
<joined-subclass name="子類類型"
extends="父類類型"
table="子類表">
<key column="子類表關聯欄位"/>
//property欄位對應
</joined-subclass>
</hibernate-mapping>
*2)父類和子類使用同一張資料表
選擇題:
編號,題目,難度,選項,選擇答案
簡答題:
編號,題目,難度,簡答答案
資料表Question
編號,題目,難度,選項,選擇答案,簡答答案,題目類型
使用<subclass>定義子類映射,具體步驟:
a.修改實體類,定義成父類和子類的結構
b.在對應檔中定義映射
<hibernate-mapping>
<class name="父類型" table="資料表">
//定義父類中屬性的映射
<discriminator column="區分欄位"/>
<subclass name="子類1"
discriminator-value="區分值">
//定義子類1中屬性的映射
</subclass>
<subclass name="子類2"
discriminator-value="區分值">
//定義子類2中屬性的映射
</subclass>
</class>
<hibernate-mapping>
以上是兩種繼承關係映射,注意一點<joined-subclass>配置的映射,對應兩張表,兩張實體類,兩表的id應該是一一對應的,即同一個id代表的是一個實物,還有一但定義該映射,用hibernate查詢時候 即使......餘下全文>>