您的位置:首页 > 其它

hibernate映射一对多,双向关系[关联自身],初学例子四

2010-06-09 11:13 676 查看
category bean 

package bean;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 *
 * @author zwc
 *
 */
@SuppressWarnings("serial")
public class Category implements Serializable{
 private Long id;
 private String name;
 
 private Category parentCategory;
 private Set<Category> childCategorySet = new HashSet<Category>();
 
 
 
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Category getParentCategory() {
  return parentCategory;
 }
 public void setParentCategory(Category parentCategory) {
  this.parentCategory = parentCategory;
 }
 public Set<Category> getChildCategorySet() {
  return childCategorySet;
 }
 public void setChildCategorySet(Set<Category> childCategorySet) {
  this.childCategorySet = childCategorySet;
 }
}

 

 

category.hbm.xml   配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bean">
 <class name="bean.Category" table="t_category">
  <id name="id" column="id" type="long">
   <generator class="native"/>
  </id>
  <property name="name" column="name" type="string" not-null="true"/>
  
  <many-to-one name="parentCategory" column="parent_category_id" class="bean.Category" not-null="false"/>

注意:这里的父类,必须设置可以为空,因为,顶层父类是没有父类的,

 

  <set name="childCategorySet" inverse="true">

注意:这里的   inverse  最好设置为true  ,防止多次的更新操作,

 

关于保存:如果这里设置了,级联保存,那么保存时,就可以只保存对应的当前category对象,对于他的父类,子类,可以级联保存

 cascade="save-update"

 

 

 

 

   <key column="parent_category_id"/>
   <one-to-many class="bean.Category"/>
  </set>
 </class>
</hibernate-mapping>

 

 

 

测试类

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import bean.Category;

/**
 *
 * @author zwc
 *
 */
@SuppressWarnings("serial")
public class OperateCategory extends HttpServlet {
 private static Logger logger = Logger.getLogger(OperateCustomer.class);
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doPost(request,response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html;charset=UTF-8");
  response.setCharacterEncoding("UTF-8");
  request.setCharacterEncoding("UTF-8");
  PrintWriter out = response.getWriter();
  
  out.write("<title>Test-Hibernate</title>");
  
  Configuration config = new Configuration();
  Session session = config.addClass(Category.class)

注意:这里,对与是否要添加class,说明:如果这里添加类,那么对于配置文件里可以不用配置map

<mapping resource="bean/XXX.hbm.xml"/>

 

 

不同的选则,根据自己的喜好,

 

 

   .buildSessionFactory()
   .openSession();
  Transaction t = session.beginTransaction();
  try {
   Category parent = (Category) session.get(Category.class, 1L);
   
   Category myself = new Category();
   myself.setName("MySelf");
   
   Category child1 = new Category();
   child1.setName("child1");
   child1.setParentCategory(myself);
   
   Category child2 = new Category();
   child2.setName("child2"); 
   child2.setParentCategory(myself);
   
   Set<Category> set = new HashSet<Category>();
   set.add(child1);
   set.add(child2);

   
   myself.setParentCategory(parent);
   myself.setChildCategorySet(set);
   session.save(child1);
   session.save(child2);
   session.save(myself);
   
   t.commit();
  } catch (Exception e) {
   t.rollback();
   logger.debug("保存Category失败",e);
  }

  
  Query query = session.createQuery("from Category");
  
  Iterator<Category> i = query.iterate();
  while(i.hasNext()){
   Category c = i.next();
   out.println("<br>========================关系=========================<br>");
   if(c.getParentCategory() != null){
    out.println("parent: " + c.getParentCategory().getName());
   }else{
    out.println("parent: Empty!!");
   }
   out.println("<br>");
   
   out.println("Self: " + c.getName());
   
   out.println("<br>");
   
   if(!c.getChildCategorySet().isEmpty()){
    out.print("childs: ");
    Iterator<Category> ii = c.getChildCategorySet().iterator();
    while(ii.hasNext()){
     Category cc = ii.next();
     out.print(cc.getName() + " ");
    }
   }else{
    out.print("childs: Empty!!");
   }
  }
 }
}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息