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对象持久化技术详解 孙卫琴
闽公网安备 35060202000074号