天天看點

Hibernate筆記②--hibernate類生成表、id生成政策、級聯設定、繼承映射

一、多表的一個關聯關系

老師和學生是一對多的關系

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的屬性如下:

  1. identity 資料庫自動增長的 Oracle資料庫不支援

②increment 程式調用增長的 select max(id)from table

他們的共性是都是自增長,程式員無序指定屬性值。

③uuid 通過Java.util.uuid類生成的唯一的辨別符,

④native 将主鍵的生成交給資料庫,hibernate不管。

⑤assigned 在插入主鍵的時候由程式處理。

⑥sequence 調用底層資料庫序列生成主鍵,适用于Oracle

四cascade的屬性

  1. save-update當儲存或修改對象時,級聯儲存所有與之關聯的臨時對象,級聯更新所有與之關聯的托管對象。
  2. delete 如果老師删了的話 學生也就沒了。級聯删除所有與之關聯的對象。
  3. 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();

}