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!!");
}
}
}
}
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!!");
}
}
}
}
相关文章推荐
- hibernate映射一对多,双向关系,初学例子三
- Hibernate关系映射(五)一对多、多对一双向关联@OneToMany @OneToMany Annotation方式
- hibernate映射一对多,单向关系,初学例子二
- hibernate映射关系 一对多、多对一单向关联 一对多双向关联
- Hibernate关系映射级别注解(一对多单向外键关联、一对多(多对一)双向外键关联)
- 一对多自身关联双向映射
- Hibernate关系映射 --- 一对一实例分析(双向关联,是基于主键的)
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式
- Hibernate关系映射(9)_多对一双向关联
- hibernate 关联映射:多对一(一对多)双向关联关系
- hibernate映射多对多,一对一,一对多,自身关联综合应用
- Hibernate之对象关系映射05一对一双向主键关联
- hibernate的一对多双向关联映射----客户和订单关系
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式 双向关联和单向关联的区别
- Java的Hibernate框架中一对多的单向和双向关联映射
- Hibernate 双向的自身关联映射
- Hibernate之对象关系映射04一对一双向关联
- hibernate-关系映射一对多(多对一)双向关联)-10
- hibernate双向多对一(一对多)及自身一对多关联
- hibernate映射 【映射组成关系】,初学例子五