一个一对多双向自身关联映射案例
<?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> <class name="com.bjpowernode.hibernate.Category" table="t_category"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="parentCategory" column="category_id" cascade="save-update"/> <set name="childCategory" cascade="save-update"> <key column="category_id"/> <one-to-many class="com.bjpowernode.hibernate.Category"/> </set> </class> </hibernate-mapping>
package com.bjpowernode.hibernate; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class Category implements Serializable{ private Integer id; private String name; private Category parentCategory; private Set childCategory = new HashSet(); public Integer getId() { return id; } private void setId(Integer 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 getChildCategory() { return childCategory; } public void setChildCategory(Set childCategory) { this.childCategory = childCategory; } }
工具类
package com.bjpowernode.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory factory; static { try { //读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); //建立SessionFactory factory = cfg.buildSessionFactory(); }catch(Exception e) { e.printStackTrace(); } } public static Session getSession() { return factory.openSession(); } public static void closeSession(Session session) { if (session != null) { if (session.isOpen()) { session.close(); } } } public static SessionFactory getSessionFactory() { return factory; } }
测试类:
package com.bjpowernode.hibernate; import java.util.HashSet; import org.hibernate.Session; import junit.framework.TestCase; public class Test extends TestCase { public void addCategory(){ //创建session Session session = null; try{ session = HibernateUtils.getSession(); session.beginTransaction(); Category food = new Category(); food.setName("food"); Category vegetable = new Category(); vegetable.setName("vegetable"); Category fruit = new Category(); fruit.setName("fruit"); Category tomato = new Category(); tomato.setName("tomato"); Category apple = new Category(); apple.setName("apple"); Category orange = new Category(); orange.setName("orange"); food.getChildCategory().add(vegetable); vegetable.setParentCategory(food); food.getChildCategory().add(fruit); fruit.setParentCategory(food); fruit.getChildCategory().add(apple); apple.setParentCategory(fruit); fruit.getChildCategory().add(orange); orange.setParentCategory(fruit); fruit.getChildCategory().add(tomato); tomato.setParentCategory(fruit); session.save(food); session.beginTransaction().commit(); } catch(Exception e){ session.beginTransaction().rollback(); e.printStackTrace(); } finally{ HibernateUtils.closeSession(session); } } public void modifyCategory(){ //创建session Session session = null; try{ session = HibernateUtils.getSession(); session.beginTransaction(); Category tomato = (Category)session.get(Category.class, 5); Category vegetable = (Category)session.get(Category.class, 6); Category fruit = (Category)session.get(Category.class, 2); fruit.getChildCategory().remove(tomato); vegetable.getChildCategory().add(tomato); tomato.setParentCategory(vegetable); session.beginTransaction().commit(); } catch(Exception e){ session.beginTransaction().rollback(); e.printStackTrace(); } finally{ HibernateUtils.closeSession(session); } } }