轉載請注明: 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()才對。
新聞熱點
疑難解答