`
Beaver's
  • 浏览: 389415 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

Hibernate多对一自身关联

阅读更多
说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示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"。然后就直接写测试类进行测试。

本文出自 “熔 岩” 博客,转载请与作者联系!
分享到:
评论
1 楼 wpfwupengfeiwpf 2010-09-11  
你好,我想请问如何将父类father_id为null的记录在保存时保存为0

相关推荐

    myeclipse试用小记----Hibernate多对一自身关联(3)

    NULL 博文链接:https://kuangyeyazi.iteye.com/blog/2179371

    Hibernate一对多双向自身关联demo代码

    Hibernate一对多双向自身关联demo代码

    hibernate一对多双项自身关联关系示例

    hibernate一对多双项自身关联关系示例 带数据库ddl

    hibernate3.2级联关系自身一对多双向关联

    hibernate3.2级联关系自身一对多双向关联,适合初学者熟悉hibernate框架。

    hibernate自身关联一对多实例(树形结构)

    NULL 博文链接:https://fangguanhong.iteye.com/blog/1735492

    java Hibernate 一对多自身关联问题

    formBean在提交表单的时候,域中数据库在下一次中仍然保留引起的,struts formBean 默认的scope为session,手动设置为request,就好了

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    Hibernate学习笔记_songjignhao_1

    自己记录的学习笔记,内容很详细,有代码,包括:一对多双向关联关系、一对多双向自身关联关系、一对一关联关系(主键关联、外键关联)、一对多与一对一结合、多对多关联关系、Map、Set、List与Bag映射关系、查询...

    Hibernate中文API大全

    组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be considered an exotic usage)。 Hibernate倾向于支持...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  ...

    深入浅出Hibernate中文版 part1

    6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用...

    精通Java Web整合开发(第2版)

    12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多双向关联的annotation注解实现545 12.4.10 组成关系映射的annotation注解实现547 12.4.11 继承关系...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、...

    hibernate配置文件

    该文档总结了hibernate各种关联模式,单向多对一,单向一对多,双向一对多,双向多对多,自身一对多关联,以及oracle,mysql的相关数据库连接配置,希望对您学习有帮助。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  ...

    深入浅出Hibernate中文版 part2

    6.10 版面:一棵自身循环的树 6.11 版面与帖子:Master/Detail 主从关系 6.12 帖子树及其分页 6.13 与Web层交互 6.14 帖子的多形扩展:投票 6.15 移植到Hibernate 3 6.16 结束语 第3部分 附 录 第7章 常用...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  ...

    精通Hibernate:对象持久化技术第二版part3

    7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、...

Global site tag (gtag.js) - Google Analytics