Hibernate自關聯關系

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的關聯關系映射
前言以下所有描述以選課系統這個案例來說明。在一個選課系統中,基本的對象有課題(Course)、教師(Teacher)和學生(Student)。 一、一對一關聯(有共享主鍵關聯和惟一外鍵關聯兩種)1、共享主鍵關聯 比如課題是由教師去...查看完整版>>Hibernate的關聯關系映射
 
Hibernate自關聯關系
Hibernate自關聯關系業務邏輯:書籍的種類,本身是自關聯的關系,如下圖所示: 所有書籍:曆史書籍音樂書籍 鋼琴書籍烹饪書籍 美食書籍 1. Books類的源程序Books.javapackage mypack; impo...查看完整版>>Hibernate自關聯關系
 
Java應用數據庫:Hibernate對多表關聯查詢
由于公司項目的需要,我對Hibernate對多表關聯查詢研究了一下,現總結如下,供朋友參考。 一、 Hibernate簡介Hibernate是一個JDO工具。它的工作原理是通過文件(一般有兩種:xml文件和properties文件)把值對象和數據...查看完整版>>Java應用數據庫:Hibernate對多表關聯查詢
 
Eclipse快速上手Hibernate--8. 關聯映射(多對多)
Hibernate中的關聯(Association)映射主要有三種:一對一關聯,一對多(或多對一)關聯,多對多關聯。每種關聯都可以分爲單向和雙向兩種。 前面文章已經說了一對一關聯和一對多(或多對一)關聯,這次談談多對多關...查看完整版>>Eclipse快速上手Hibernate--8. 關聯映射(多對多)
 
Hibernate的繼承關系
一、每個子類對應一個數據表(Table per concrete class)...查看完整版>>Hibernate的繼承關系