一、多表的一個關聯關系
老師和學生是一對多的關系
student:tid屬性 外鍵限制 對應teacher表中的id屬性
teacher:id
在myeclipse的db視窗中選中兩個表來生成類。
寫一個CRUD
//老師和學生實體儲存 public void save(){ Teacher t=new Teacher(); t.setName("彭老師"); Student s1=new Student(); s1.setName("郭靖"); Student s2=new Student(); s2.setName("楊康"); s1.setTeacher(t); s2.setTeacher(t); Set<Student> ss=new HashSet<Student>(); ss.add(s1); ss.add(s2); t.setStudents(ss); Session session=HibernateSessionFactory.getSession(); Transaction tx=session.beginTransaction(); session.save(s1); session.save(s2); tx.commit(); HibernateSessionFactory.closeSession(); } |
此時實體是儲存不進去的,需要在學生實體的hbm.xml配置檔案中的many-to-one 标簽中添加cascade="all" 設定級聯級别為all
<many-to-one name="teacher" class="com.hibernate.entity.Teacher" fetch="select" cascade="all"> <column name="tid" /> </many-to-one> |
此時資料才可插入成功。老師和學生都可以儲存。
①對象的三種狀态
1臨時狀态:
使用new指令開辟記憶體空間的Java對象,在記憶體中孤立存在
2持久狀态:
資料庫中存在。
3遊離狀态
與Session關聯的對象
二
由類和配置檔案生成表的類
Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
手寫一個配置檔案
Stu.hbm.xml
<class name="com.hibernate.model.Stu" table="t_stu"> <id name="id"> <column name="id"></column> <generator class="uuid"></generator> </id> <property name="name"></property> name="age"></property> <many-to-one name="teacher" class="com.hibernate.model.Teacher" cascade="save-update"> name="tid"></column> </many-to-one> </class> |
Theacher.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> name="com.hibernate.model.Teacher" table="t_table"> name="id"/> <set name="stus" cascade="delete"> <key> <column </key> <one-to-many class="com.hibernate.model.Stu"/> </set> </hibernate-mapping> |
還要在hibernate.cfg.xml
添加:
<mapping resource="com/hibernate/model/Teacher.hbm.xml" resource="com/hibernate/model/Stu.hbm.xml" |
三 id的生成政策
<id name="實體類屬性名" type="java.lang.Integer">
<column name="對應表中主鍵字段名" />
<generator class="assiged|increment|identity|native|........" />
</id>
generator class的屬性如下:
- identity 資料庫自動增長的 Oracle資料庫不支援
②increment 程式調用增長的 select max(id)from table
他們的共性是都是自增長,程式員無序指定屬性值。
③uuid 通過Java.util.uuid類生成的唯一的辨別符,
④native 将主鍵的生成交給資料庫,hibernate不管。
⑤assigned 在插入主鍵的時候由程式處理。
⑥sequence 調用底層資料庫序列生成主鍵,适用于Oracle
四cascade的屬性
- save-update當儲存或修改對象時,級聯儲存所有與之關聯的臨時對象,級聯更新所有與之關聯的托管對象。
- delete 如果老師删了的話 學生也就沒了。級聯删除所有與之關聯的對象。
- all 包括save-update和delete 的所有屬性
inverse 老師放棄維護關系,級聯儲存的時候
節省update的語句
指定誰來維護關聯關系,不是必須的,在關聯關系中,通常讓多的那一方來維護關聯關系。
五繼承關系映射
鑒别器
product book ps
三種方式 類的結構相同 配置檔案不同導緻 映射出來的表結構不一樣。
第一種方式 不同對象生成的一張表,表中的字段會因類型的不同留白
name="com.hibernate.entity.Product" table="t_product" discriminator-value="A"> name="id" > <discriminator column="type" type="string"></discriminator> name="price"></property> <subclass name="com.hibernate.entity.Book" discriminator-value="B"> <property name="author"></property> </subclass> name="com.hibernate.entity.Ps" discriminator-value="P"> name="handler"></property> </class> |
第二種方式
每一個類建立自己的一張表 ,表間的一對一關系用外鍵關聯描述
Jioned-subclass 來描述子表特有的屬性
table="t_product"> type="java.lang.String"> class="uuid"/> name="name" length="20"/> </property> name="price" type="java.lang.Double"></property> <joined-subclass table="t_book"> <key column="bid"></key> </joined-subclass> table="t_Ps"> column="pid"></key> |
第三種方式 将每個類的所有屬性都建立一個表,(包含着父類的所有屬性)
Unioned-subclass
<class <id <generator class="uuid" </id> <property name="NAME" length="20" /> </property> name="price" type="java.lang.Double"> <union-subclass <property </union-subclass> table="t_ps"> </union-subclass> </class> |
使用crud進行測試
package com.hibernate.dao; import java.util.HashSet; import java.util.Set; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import com.hibernate.entity.Book; import com.hibernate.entity.Product; import com.hibernate.entity.Ps; import com.hibernate.model.Teacher; import com.hibernate.model.Stu; import com.hibernate.util.HibernateSessionFactory; public class CRUD { //老師和學生實體儲存 Stu s1=new Stu(); Stu s2=new Stu(); Set<Stu> ss=new HashSet<Stu>(); t.setStus(ss); //儲存 product對象 public void save2(){ Product p=new Product(); p.setName("産品"); p.setPrice(100.00); Book b=new Book(); b.setName("鋼鐵是怎樣練成的"); b.setPrice(99.9); b.setAuthor("奧斯特洛夫斯基"); Ps p1=new Ps(); p1.setName("play station"); p1.setPrice(230); p1.setHandler("尼古拉"); session.save(p); session.save(b); session.save(p1); //将product對象 查找出來 public void query(){ Product p=(Product)session.get(Product.class, "4028d0814ec3de48014ec3de49950002"); System.out.println(p.getPrice()); Book b=(Book)p; System.out.println(b.getAuthor()); public static void main(String[] args) { CRUD crud=new CRUD(); // crud.save2(); crud.query(); } |