说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示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);
表关系的逻辑图:
+-----------+
| Part |
+-----------+
| id |<---------|<PK>
| name | |
| father_id |----------|<FK>
+-----------+
特别注意:因为有外键约束,需要事务支持,在安装数据库的时候,需要配置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"。然后就直接写测试类进行测试。
本文出自 “熔 岩” 博客,转载请与作者联系!
分享到:
相关推荐
NULL 博文链接:https://kuangyeyazi.iteye.com/blog/2179371
Hibernate一对多双向自身关联demo代码
hibernate一对多双项自身关联关系示例 带数据库ddl
hibernate3.2级联关系自身一对多双向关联,适合初学者熟悉hibernate框架。
NULL 博文链接:https://fangguanhong.iteye.com/blog/1735492
formBean在提交表单的时候,域中数据库在下一次中仍然保留引起的,struts formBean 默认的scope为session,手动设置为request,就好了
这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....
自己记录的学习笔记,内容很详细,有代码,包括:一对多双向关联关系、一对多双向自身关联关系、一对一关联关系(主键关联、外键关联)、一对多与一对一结合、多对多关联关系、Map、Set、List与Bag映射关系、查询...
组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be considered an exotic usage)。 Hibernate倾向于支持...
7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命周期 8.2 理解Session的缓存 8.2.1 Session的缓存的作用 ...
6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用...
12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多双向关联的annotation注解实现545 12.4.10 组成关系映射的annotation注解实现547 12.4.11 继承关系...
7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、...
该文档总结了hibernate各种关联模式,单向多对一,单向一对多,双向一对多,双向多对多,自身一对多关联,以及oracle,mysql的相关数据库连接配置,希望对您学习有帮助。
7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命周期 8.2 理解Session的缓存 8.2.1 Session的缓存的作用 ...
7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命周期 8.2 理解Session的缓存 8.2.1 Session的缓存的作用 ...
6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用...
7.3 映射一对多双向自身关联关系 7.4 改进持久化类 7.5 小结 7.6 思考题 第8章 通过Hibernate操纵对象(上) 8.1 Java对象在JVM中的生命周期 8.2 理解Session的缓存 8.2.1 Session的缓存的作用 ...
7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、...