服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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对象持久化技术详解  孙卫琴

扫描关注微信公众号