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對象持久化技術詳解 孫衛琴