| 導購 | 订阅 | 在线投稿
分享
 
 
 

Hibernate自關聯關系

來源:互聯網網民  2006-04-20 05:58:29  評論

Hibernate自關聯關系

業務邏輯:

書籍的種類,本身是自關聯的關系,如下圖所示:

所有書籍:

曆史書籍

音樂書籍

鋼琴書籍

烹饪書籍

美食書籍

1. Books類的源程序

Books.java

package mypack;

import java.util.Set;

import java.io.Serializable;

public class Books

implements Serializable {

/**

* 默認構造函數

*/

public Books() {

}

/** 主健id */

private Long id;

/** 書籍名稱 */

private String name;

/** 父書籍 */

private mypack.Books parentCategory;

/** 子集合 */

private Set childCategories;

/** 完整構造函數 */

public Books(String name, mypack.Books parentCategory, Set childCategories) {

this.name = name;

this.parentCategory = parentCategory;

this.childCategories = childCategories;

}

/** 最小構造函數 */

public Books(Set childCategories) {

this.childCategories = childCategories;

}

public Long getId() {

return this.id;

}

public void setId(Long id) {

this.id = id;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

public mypack.Books getParentCategory() {

return this.parentCategory;

}

public void setParentCategory(mypack.Books parentCategory) {

this.parentCategory = parentCategory;

}

public Set getChildCategories() {

return this.childCategories;

}

public void setChildCategories(Set childCategories) {

this.childCategories = childCategories;

}

}

2. 映射文件,放在classes/mypack下

Books.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping

PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping >

<class name="mypack.Books" table="books" >

<id name="id" type="long" column="ID">

<generator class="increment"/>

</id>

<property name="name" type="string" >

<column name="NAME" length="15" />

</property>

<set

name="childCategories"

cascade="save-update"

inverse="true"

>

<key column="CATEGORY_ID" />

<one-to-many class="mypack.Books" />

</set>

<many-to-one

name="parentCategory"

column="CATEGORY_ID"

class="mypack.Books"

cascade="save-update"

/>

</class>

</hibernate-mapping>

3. 數據庫Schema

數據庫Schema

Create table books(

Id number(10) not null,

Name varchar2(64),

Category_id number(10),

Primary key(id)

);

1. hibernate.property

hibernate.property

hibernate.dialect net.sf.hibernate.dialect.Oracle9Dialect

hibernate.dialect net.sf.hibernate.dialect.OracleDialect

hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver

hibernate.connection.username testpm

hibernate.connection.password testpm

hibernate.connection.url jdbc:oracle:thin:@localhost:1521:wsy

4. 業務操作類BusinessService.java

package mypack;

import net.sf.hibernate.SessionFactory;

import net.sf.hibernate.cfg.Configuration;

import net.sf.hibernate.*;

import java.util.HashSet;

import java.util.List;

public class BusinessService {

public static SessionFactory sessionFactory;

static{

try{

// Create a configuration based on the properties file we've put

Configuration config = new Configuration();

config.addClass(Books.class);

// Get the session factory we can use for persistence

sessionFactory = config.buildSessionFactory();

}catch(Exception e){e.printStackTrace();}

}

public BusinessService() {

}

/**

* 級聯保存

* @throws Exception

*/

public void saveCategoryWithCascade() throws Exception{

Session session = sessionFactory.openSession();

Transaction tx = null;

try {

tx = session.beginTransaction();

Books allBooks = new Books("allbooks",null,new HashSet());

Books historyBooks = new Books("history",null,new HashSet());

Books musicBooks =new Books("music",null,new HashSet());

Books cookBooks=new Books("cook",null,new HashSet());

Books pianoBooks=new Books("piano",null,new HashSet());

Books foodBooks=new Books("food",null,new HashSet());

//建立所有書與曆史書的關系

allBooks.getChildCategories().add(historyBooks);

historyBooks.setParentCategory(allBooks);

//建立所有書與音樂書的關系

allBooks.getChildCategories().add(musicBooks);

musicBooks.setParentCategory(allBooks);

//建立所有書與烹饪書的關系

allBooks.getChildCategories().add(cookBooks);

cookBooks.setParentCategory(allBooks);

//建立音樂書與鋼琴書的關系

musicBooks.getChildCategories().add(pianoBooks);

pianoBooks.setParentCategory(musicBooks);

//建立烹饪書與美食書的關系

foodBooks.setParentCategory(cookBooks);

cookBooks.getChildCategories().add(foodBooks);

session.save(allBooks);

tx.commit();

}catch (Exception e) {

if (tx != null) {

// Something went wrong; discard all partial changes

tx.rollback();

}

throw e;

} finally {

// No matter what, close the session

session.close();

}

}

/**

* 修改關系

* @throws Exception

*/

public void modifyCategoryAssociation() throws Exception{

Session session = sessionFactory.openSession();

Transaction tx = null;

try {

tx = session.beginTransaction();

Books cookBooks =findCategoryByName(session,"cook");

Books foodBooks=findCategoryByName(session,"food");

Books musicBooks=findCategoryByName(session,"music");

//建立西紅柿類和蔬菜類之間的關聯關系

foodBooks.setParentCategory(musicBooks);

musicBooks.getChildCategories().add(foodBooks);

//刪除西紅柿類和水果類之間的關聯關系

cookBooks.getChildCategories().remove(foodBooks);

tx.commit();

}catch (Exception e) {

if (tx != null) {

// Something went wrong; discard all partial changes

tx.rollback();

}

throw e;

} finally {

// No matter what, close the session

session.close();

}

}

/**

* 根據名稱,得到bean

* @param session Session

* @param name String

* @throws Exception

* @return Books

*/

private Books findCategoryByName(Session session,String name)throws Exception{

List results=session.find("from Books as c where c.name='"+name+"'");

return (Books)results.iterator().next();

}

/**

* 主方法,運行

* @param args String[]

* @throws Exception

*/

public static void main(String[] args)throws Exception{

new BusinessService().test();

sessionFactory.close();

}

/**

* 測試方法

* @throws Exception

*/

private void test()throws Exception {

saveCategoryWithCascade();

modifyCategoryAssociation();

}

}

目錄結構示意:

Classes

Hibernate.property

/mypack

Books.java

BusinessService.java

Books.hbm.xml

參考資料:精通Hibernate:Java對象持久化技術詳解 孫衛琴

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
Hibernate自關聯關系 業務邏輯: 書籍的種類,本身是自關聯的關系,如下圖所示: 所有書籍: 曆史書籍 音樂書籍 鋼琴書籍 烹饪書籍 美食書籍 1. Books類的源程序 Books.java package mypack; import java.util.Set; import java.io.Serializable; public class Books implements Serializable { /** * 默認構造函數 */ public Books() { } /** 主健id */ private Long id; /** 書籍名稱 */ private String name; /** 父書籍 */ private mypack.Books parentCategory; /** 子集合 */ private Set childCategories; /** 完整構造函數 */ public Books(String name, mypack.Books parentCategory, Set childCategories) { this.name = name; this.parentCategory = parentCategory; this.childCategories = childCategories; } /** 最小構造函數 */ public Books(Set childCategories) { this.childCategories = childCategories; } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public mypack.Books getParentCategory() { return this.parentCategory; } public void setParentCategory(mypack.Books parentCategory) { this.parentCategory = parentCategory; } public Set getChildCategories() { return this.childCategories; } public void setChildCategories(Set childCategories) { this.childCategories = childCategories; } } 2. 映射文件,放在classes/mypack下 Books.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping > <class name="mypack.Books" table="books" > <id name="id" type="long" column="ID"> <generator class="increment"/> </id> <property name="name" type="string" > <column name="NAME" length="15" /> </property> <set name="childCategories" cascade="save-update" inverse="true" > <key column="CATEGORY_ID" /> <one-to-many class="mypack.Books" /> </set> <many-to-one name="parentCategory" column="CATEGORY_ID" class="mypack.Books" cascade="save-update" /> </class> </hibernate-mapping> 3. 數據庫Schema 數據庫Schema Create table books( Id number(10) not null, Name varchar2(64), Category_id number(10), Primary key(id) ); 1. hibernate.property hibernate.property hibernate.dialect net.sf.hibernate.dialect.Oracle9Dialect hibernate.dialect net.sf.hibernate.dialect.OracleDialect hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver hibernate.connection.username testpm hibernate.connection.password testpm hibernate.connection.url jdbc:oracle:thin:@localhost:1521:wsy 4. 業務操作類BusinessService.java package mypack; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.cfg.Configuration; import net.sf.hibernate.*; import java.util.HashSet; import java.util.List; public class BusinessService { public static SessionFactory sessionFactory; static{ try{ // Create a configuration based on the properties file we've put Configuration config = new Configuration(); config.addClass(Books.class); // Get the session factory we can use for persistence sessionFactory = config.buildSessionFactory(); }catch(Exception e){e.printStackTrace();} } public BusinessService() { } /** * 級聯保存 * @throws Exception */ public void saveCategoryWithCascade() throws Exception{ Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Books allBooks = new Books("allbooks",null,new HashSet()); Books historyBooks = new Books("history",null,new HashSet()); Books musicBooks =new Books("music",null,new HashSet()); Books cookBooks=new Books("cook",null,new HashSet()); Books pianoBooks=new Books("piano",null,new HashSet()); Books foodBooks=new Books("food",null,new HashSet()); //建立所有書與曆史書的關系 allBooks.getChildCategories().add(historyBooks); historyBooks.setParentCategory(allBooks); //建立所有書與音樂書的關系 allBooks.getChildCategories().add(musicBooks); musicBooks.setParentCategory(allBooks); //建立所有書與烹饪書的關系 allBooks.getChildCategories().add(cookBooks); cookBooks.setParentCategory(allBooks); //建立音樂書與鋼琴書的關系 musicBooks.getChildCategories().add(pianoBooks); pianoBooks.setParentCategory(musicBooks); //建立烹饪書與美食書的關系 foodBooks.setParentCategory(cookBooks); cookBooks.getChildCategories().add(foodBooks); session.save(allBooks); tx.commit(); }catch (Exception e) { if (tx != null) { // Something went wrong; discard all partial changes tx.rollback(); } throw e; } finally { // No matter what, close the session session.close(); } } /** * 修改關系 * @throws Exception */ public void modifyCategoryAssociation() throws Exception{ Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Books cookBooks =findCategoryByName(session,"cook"); Books foodBooks=findCategoryByName(session,"food"); Books musicBooks=findCategoryByName(session,"music"); //建立西紅柿類和蔬菜類之間的關聯關系 foodBooks.setParentCategory(musicBooks); musicBooks.getChildCategories().add(foodBooks); //刪除西紅柿類和水果類之間的關聯關系 cookBooks.getChildCategories().remove(foodBooks); tx.commit(); }catch (Exception e) { if (tx != null) { // Something went wrong; discard all partial changes tx.rollback(); } throw e; } finally { // No matter what, close the session session.close(); } } /** * 根據名稱,得到bean * @param session Session * @param name String * @throws Exception * @return Books */ private Books findCategoryByName(Session session,String name)throws Exception{ List results=session.find("from Books as c where c.name='"+name+"'"); return (Books)results.iterator().next(); } /** * 主方法,運行 * @param args String[] * @throws Exception */ public static void main(String[] args)throws Exception{ new BusinessService().test(); sessionFactory.close(); } /** * 測試方法 * @throws Exception */ private void test()throws Exception { saveCategoryWithCascade(); modifyCategoryAssociation(); } } 目錄結構示意: Classes Hibernate.property /mypack Books.java BusinessService.java Books.hbm.xml 參考資料:精通Hibernate:Java對象持久化技術詳解 孫衛琴
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有