`
Beaver's
  • 浏览: 396407 次
  • 性别: 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)

    标题中的“myeclipse试用小记----Hibernate多对一自身关联(3)”表明了这篇内容是关于MyEclipse IDE的使用体验,特别聚焦在Hibernate框架中的多对一自身关联关系的实践与理解。Hibernate是Java开发中常用的一个对象...

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

    在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一对多的双向关联。这种关联在实际应用中常见于例如用户的朋友关系、员工的上下级关系等场景。 首先,让我们了解...

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

    本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...

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

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

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

    在Java持久化领域,Hibernate是一个广泛应用的ORM(对象...在实际项目中,这种关联模式常用于构建社交网络、组织结构、多对多关系的中间表等多种场景。因此,深入学习和实践这部分内容对于提升Java开发能力非常有帮助。

    java Hibernate 一对多自身关联问题

    在问题描述中,我们遇到的是一个关于Hibernate一对多自身关联的问题,特别是在Struts框架中使用FormBean时出现的异常行为。 首先,让我们来理解一下问题的核心部分。在Struts中,FormBean默认的Scope是Session,这...

    hibernate各种常用关联关系的基本配置

    总结来说,Hibernate的关联关系配置涵盖了从一对一到多对多的各种情况,提供了丰富的选项来满足不同业务需求。理解并熟练掌握这些关联关系及其配置,能帮助开发者更高效地进行数据操作,提升开发效率。在实际应用中...

    Hibernate持久化映射一对多和多对一

    多对一映射表示多个实体(如员工)可以关联一个实体(如部门)。在数据库层面,这表现为多个表(员工表)的记录关联同一个表(部门表)的一条记录。 **配置方式**: 多对一映射通过`&lt;many-to-one&gt;`标签实现,定义在...

    hibernate一对多双向

    在探讨“Hibernate一对多双向”这一主题时,我们首先需要...总之,“Hibernate一对多双向”关联在企业级应用中非常常见,通过深入理解其配置和实现原理,开发者可以更好地设计和优化数据库模型,以满足复杂业务需求。

    Hibernate关联关系配置

    例如,一个用户可能只关联一个地址信息,反之亦然。 2. **多对多关系**: 多对多关系是指两个实体之间可以互相拥有多个实例。在Hibernate中,通常通过创建一个关联表来实现多对多关系。例如,一个学生可以选修多门...

    Hibernate注解 关联关系映射注解.docx

    多对多的关联关系可以使用`@ManyToMany`注解,Hibernate会自动创建一个中间表来存储两个实体类之间的关联。如果需要自定义中间表的名称或字段,可以使用`@JoinTable`注解。在双向多对多关联中,依然需要`mappedBy`来...

    Hibernate一对多映射配置详解

    在Java持久化框架Hibernate中,一对多映射是常见的实体关系映射类型,它表示一个实体(例如User)可以与多个其他实体(例如Account)相关联。以下是对Hibernate一对多映射配置的详解: 一、XML文件配置 1. 单向...

    Hibernate one2one_pk_1

    在深入探讨Hibernate中的一对一主键关联双向映射之前,我们先来了解下Hibernate以及一对一双向关联的基本概念。 Hibernate是一种开源的对象关系映射(ORM)框架,它提供了从Java类到数据库表的映射机制,使得开发...

    hibernate基础 二 关联映射 级联操作

    在Hibernate中,可以通过不同的方式来表示一对多的关系,其中最常用的方式是在“多”的一方定义集合属性来关联“一”。 - **外键关联**:在“多”的一方的表中添加一个外键,指向“一”的一方的主键。 - **主键关联...

    jquery树(hibernate自关联)myeclipse7.0

    同时,还需要配置一对多或多对一的关系,根据实际需求选择。 3. **Java实体类**:创建`Category`实体类,包含属性id、name和parent(指向自身类型,表示父分类),并实现对应的getter和setter方法。 4. **...

    hibernate父亲与孩子

    本文将深入探讨“Hibernate父亲与孩子”这一主题,即Hibernate中的多对一和一对多关系映射,以及如何利用Hibernate处理面向对象的树型结果。 在数据库设计中,"父亲"和"孩子"的概念通常对应于实体之间的关联关系,...

    hibernate中的对象关系模型

    7. **自身关联(Self-association)**: 类的一个实例可以关联自身,例如树的枝丫结构。在Java中,类中会包含一个自身类型的属性,使用`@ManyToOne`或`@OneToOne`等注解来映射。 8. **泛化(Generalization)**: ...

    hibernate3.2.5源代码

    Hibernate支持一对一、一对多、多对一和多对多等各种关联映射。源代码展示了如何配置和处理这些关联关系。 10. **性能优化** Hibernate 3.2.5提供了许多性能优化手段,如批处理(Batch Processing)、延迟加载...

Global site tag (gtag.js) - Google Analytics