国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

hibernate查漏補缺1

2019-11-14 21:59:10
字體:
來源:轉載
供稿:網友
hibernate查漏補缺1

轉載請注明: TheViperhttp://m.survivalescaperooms.com/TheViper

sessionFactory接口

一個SessionFactory接口對應一個數據存儲源。特點:

1.線程安全。即它的同一個實例可以被應用的多個線程共享。

2.重量級。創建和銷毀它的實例所花費的代價很大,所以應用的一個數據庫對應一個SessionFactory實例,在初始化時創建。

Session接口

持久化管理器,復雜和持久化的相關操作。特點:

1.不是線程安全。2.實例是輕量級的。

Hibernate的映射類型

有一點說明下,如果需要存儲的字符串比較多,而且字符串長度也不好掌握,數據庫就不好用varchar.這時可以像這樣.

        <PRoperty name="content">            <column name="content" sql-type="mediumtext" />        </property>

pojo那邊的content類型設置成String.可以看到上面表里面sql字段類型沒有mediumtext.這樣做就可以讓java String數據庫直接映射成medirmtext了。我用的是MySQL,不知道其他數據庫是不是這樣的。

映射主鍵

1.單個主鍵

        <id name="feeling_id" type="java.lang.Integer">            <column name="feeling_id " length="20" />            <generator class="native" />        </id>

2.復合主鍵

(1)與其他表無關聯

比如:名字(name),好友名字(friend_name),好友分類(sort),name和friend_name組成復合主鍵user_friend_pk。

對user_friend_pk,單獨創建一個User_Friend_pk類,繼承Serializable接口,并重寫hashCode(),equals(Object obj)方法。

對pojoUser_Friend類,對User_Friend_pk setter,getter即可。

映射文件:

<?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>    <class name="cls.User_Friend" table="user_friends">        <composite-id name="user_friend_pk" class="cls.User_Friend_pk">            <key-property name="name" column="name" type="java.lang.String"                length="20"></key-property>            <key-property name="friend_name" column="friend_name"                type="java.lang.String" length="20"></key-property>        </composite-id>        <property name="sort" type="java.lang.String">            <column name="sort" length="20" />        </property>    </class></hibernate-mapping>

(2)與其他表有關聯

比如:User表(id,name) User_Friend表和上面一樣,只不過把name和friend_name換成id和friend_id,這就形成了關聯。

這和上面的區別在于映射文件。

<?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>    <class name="model.cls.User_Friend" table="user_friends">        <composite-id name="user_friend_pk" class="model.cls.User_Friend_pk">            <key-many-to-one name="ids" class="model.cls.User">                <column name="id"></column>            </key-many-to-one>            <key-many-to-one name="friend_ids" class="model.cls.User">                <column name="friend_id"></column>            </key-many-to-one>        </composite-id>        <property name="sort" type="java.lang.String">            <column name="sort" length="20" />        </property>    </class></hibernate-mapping>

下面來個復雜點的。

student表,班級(classId),學號(studentId).這兩個可以確定一個學生,構成復合主鍵。

course表,課程id(courseId),課程名(courseName).

很顯然,這兩個是多對多的關系。我們用<many-to-many>構建單向的多對多映射。當然也可以用兩個一對多關系來構建。

映射文件student.hbm.xml

<?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>    <class name="cls.Student" table="student">        <composite-id name="studentPk" class="cls.StudentPk">            <key-property name="studentId" column="studentId"                type="java.lang.Integer"></key-property>            <key-property name="classId" column="classId" type="java.lang.Integer"></key-property>        </composite-id>    </class></hibernate-mapping>

course.hbm.xml

<?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>    <class name="cls.Course" table="course">        <id name="courseId" type="java.lang.Integer">            <column name="courseId " length="20" />            <generator class="native" />        </id>        <property name="courseName" type="java.lang.String">            <column name="courseName" length="20" />        </property>        <set name="StudentCourse" table='StudentCourse'>            <key column="courseId" />            <many-to-many class="cls.Student">                <column name="studentId"></column>                <column name="classId"></column>            </many-to-many>        </set>    </class></hibernate-mapping>

關于<set>上的inverse屬性

作用:決定是由誰來維護表和表之間的關系的。這里有個前提,這兩個表之間必須是雙向關聯,道理很簡單,比如一對多關系,在“一”那邊設置了“一對多” inverse=true,讓“多”那邊來維護,但沒有設置“多“那邊的集合或類對象的映射,讓”多“那邊怎么去維護。

比如上面復合主鍵的第二個例子,我把sort(分類)變成一個friend_category_id,另外建個表friend_category。

映射文件Friend_category.hbm.xml

<?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>    <class name="cls.Friend_Category" table="friend_category">        <id name="friend_category_id" type="java.lang.Integer">            <column name="friend_category_id " length="20" />            <generator class="native" />        </id>        <property name="category_name" type="java.lang.String">            <column name="category_name" length="20" />        </property>        <set name="user_friends" inverse="true">            <key column="friend_category_id" />            <one-to-many class="cls.User_Friend" />        </set>    </class></hibernate-mapping>

User_friend.hbm.xml

<?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>    <class name="cls.User_Friend" table="user_friends">        <composite-id name="user_friend_pk" class="cls.User_Friend_pk">            <key-property name="name" column="name" type="java.lang.String"                length="20"></key-property>            <key-property name="friend_name" column="friend_name"                type="java.lang.String" length="20"></key-property>        </composite-id><!--         <many-to-one name="friend_categorys" column="friend_category_id" --><!--             class="cls.Friend_Category"> --><!--         </many-to-one> -->        <!-- <property name="sort" type="java.lang.String"> -->        <!-- <column name="sort" length="20" /> -->        <!-- </property> -->    </class></hibernate-mapping>

為兩表插入數據

        Friend_Category fc = new Friend_Category();        fc.setCategory_name("好基友");        User_Friend_pk pk = new User_Friend_pk();        pk.setFriend_name("daut");        pk.setName("TheViper");        User_Friend uf = new User_Friend();        uf.setUser_friend_pk(pk);        uf.setFriend_categorys(fc);        // uf.setSort("好基友");        session.save(fc);        session.save(uf);
Hibernate:     insert     into        friend_category        (category_name)     values        (?)Hibernate:     insert     into        user_friends        (name, friend_name)     values        (?, ?)

可以看到在user_friends表中并沒有插入friend_category_id字段。

還有一點,既然是雙向關聯了,上面插入數據的代碼我也完全可以這樣寫。

         Friend_Category fc = new Friend_Category();         fc.setCategory_name("好基友");         User_Friend_pk pk = new User_Friend_pk();         pk.setFriend_name("daut");         pk.setName("TheViper");         User_Friend uf = new User_Friend();         uf.setUser_friend_pk(pk);         Set user_friends = new HashSet();         user_friends.add(uf);         fc.setUser_friends(user_friends);         session.save(fc);        session.save(uf);
Hibernate:     insert     into        friend_category        (category_name)     values        (?)Hibernate:     insert     into        user_friends        (friend_category_id, name, friend_name)     values        (?, ?, ?)

可以看到,這次user_friends表總算插入了friend_category_id字段,但是一看數據,friend_category_id字段居然木有數據。

因為你已經inverse=true了,兩表關系就由user_friends(User_Friend類)來維護了,但是上面的代碼卻是通過Friend_Category的setUser_friends()添加關聯。這時應該是User_Friend的setFriend_categorys()才對。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湖南省| 祁门县| 屏边| 南陵县| 乐东| 佛坪县| 廊坊市| 高密市| 洪雅县| 常宁市| 南开区| 昭通市| 文登市| 嵊州市| 胶南市| 昌吉市| 平湖市| 新民市| 方山县| 郓城县| 嘉兴市| 吉林省| 甘洛县| 鹤岗市| 龙州县| 丰宁| 民乐县| 盐池县| 安泽县| 阳新县| 绵竹市| 新平| 普陀区| 辽宁省| 塘沽区| 登封市| 福鼎市| 阳原县| 股票| 沁源县| 平昌县|