注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

清风幻影的博客

Where there is love, I will be there.

 
 
 

日志

 
 
关于我

同是天涯沦落人,相逢何必曾相识. 天生我材必有用,千金散尽还复来. 天若有情天亦老,人间正道是沧桑. 月影西斜人已去, 堤上梅花情依旧, 此情故已成追忆, 美人如玉夜留香

Hibernate多对一自身关联  

2012-06-20 10:12:51|  分类: hibernate资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://jinnaxu-tju-edu-cn.iteye.com/blog/606308
说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示myeclipse如何实现这种树形关系的持久化。 

开发工具:myeclipse 7.0 GA 
数 据 库:mysql-5.0.41 
操作系统:windows xp professional 中文版 

步骤: 
1、建立mysql5数据库testdb,脚本下面已经给出。 
2、配置myeclipse的数据库服务器,并建立名称为mysql的数据库链接。 
3、建议myeclipse的web工程,名称为hibernateRel,并加入hibernate支持。 
4、在myeclipse的数据库视图中链接数据库并通过表生成实体POJO和配置文件,中间不生成DAO。 
5、检查配置文件的正确性,然后测试类进行测试。 


一、建立数据库的脚本: 

drop table if exists part; 

-- alter table part drop foreign key fk_part; 

create table part( 
id bigint not null primary key, 
name varchar(20), 
father_id bigint 
); 

alter table part add index fk_part (father_id), 
add constraint fk_part foreign key (father_id) references part(id); 

表关系的逻辑图: 
Java代码  收藏代码
  1. +-----------+  
  2. | Part      |  
  3. +-----------+  
  4. | id        |<---------|<PK>  
  5. | name      |          |  
  6. | father_id |----------|<FK>  
  7. +-----------+  


特别注意:因为有外键约束,需要事务支持,在安装数据库的时候,需要配置mysql数据库服务器的参数。数据库的引擎应该用InnoDB,关闭了自动提交模式,也就是SET AUTOCOMMIT=0。 
  
二、通过myeclipse生成实体和配置文件: 

Part.java 

public class Part implements java.io.Serializable {

// Fields

private Long id;
private String name;
private Part part; //父Part
private Set parts = new HashSet(0); //子Part

// Constructors

/** default constructor */
public Part() {
}

/** minimal constructor */
public Part(Long id) {
this.id = id;
}

public Part(String name) {
this.name = name;
}

/** full constructor */
public Part(Long id, Part part, String name, Set parts) {
this.id = id;
this.part = part;
this.name = name;
this.parts = parts;
}

// Property accessors

public Long getId() {
return this.id;
}

public void setId(Long id) {
this.id = id;
}

public Part getPart() {
return this.part;
}

public void setPart(Part part) {
this.part = part;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public Set getParts() {
return this.parts;
}

public void setParts(Set parts) {
this.parts = parts;
}

}


Part.hbm.xml 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"[url]http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd[/url]">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.lavasoft.Part" table="part">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<many-to-one name="part" class="org.lavasoft.Part" fetch="select">
<column name="father_id" />
</many-to-one>
<set name="parts" cascade="save-update" inverse="true">
<key>
<column name="father_id" />
</key>
<one-to-many class="org.lavasoft.Part" />
</set>
</class>
</hibernate-mapping>

三、写测试类进行测试: 
Test.java 

package org.lavasoft;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Part p1=new Part("p1");
Part p11=new Part("p11");
Part p12=new Part("p12");

p1.getParts().add(p11);
p1.getParts().add(p12);
p11.setPart(p1);
p12.setPart(p1);

Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();

try{
session.save(p1);
tx.commit();
}catch(HibernateException e){
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}
}
}

四、运行测试类Test,控制台打印信息: 
------------------------------------------ 
Hibernate: select max(id) from part 
Hibernate: insert into part (name, father_id, id) values (?, ?, ?) 
Hibernate: insert into part (name, father_id, id) values (?, ?, ?) 
Hibernate: insert into part (name, father_id, id) values (?, ?, ?) 


查看数据库: 

D:\mysql-5.0.41-win32\bin>mysql -uroot -123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.0.41-community MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use testdb;
Database changed

mysql> describe part;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | | |
| name | varchar(20) | YES | | NULL | |
| father_id | bigint(20) | YES | MUL | NULL | |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from part;
+----+------+-----------+
| id | name | father_id |
+----+------+-----------+
| 1 | p1 | NULL |
| 2 | p12 | 1 |
| 3 | p11 | 1 |
+----+------+-----------+
3 rows in set (0.00 sec)

mysql>

测试结果表明,保存父机关的时候,可以级联保存父机关下的子机关。 

总结:这个表建立好后,由myeclipse生成的POJO不需要做任何改动,生成的mapping也需要添加一个cascade="save-update"。然后就直接写测试类进行测试。 
  评论这张
 
阅读(599)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018