开发者社区> 技术小阿哥> 正文

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

简介:
+关注继续查看
说明:一个部门有若干个子部门,子部门还可以有子部门,本文通过这个演示myeclipse如何实现这种树形关系的持久化。
 
开发工具:myeclipse 5.5.1 GA
数 据 库:mysql-5.0.37
操作系统:windows xp professional 中文版
 
步骤:
1、建立mysql5数据库testdb,脚本下面已经给出。
2、配置myeclipse的数据库服务器,并建立名称为mysql5的数据库链接。
3、建议myeclipse的web工程,名称为dx_d2yzs,并加入hibernate支持,选择hibernate3.1,最高就支持到3.1。
4、在myeclipse的数据库视图中链接数据库并通过表生成实体PO和配置文件,中间不生成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。
 
my.ini
------------------------------------
#[WinMySQLAdmin]
#Server=D:/mysql-5.0.37-win32/bin/mysqld.exe
 
[mysqld]
# set basedir to your installation path
#basedir=D:/mysql-5.0.37-win32
# set datadir to the location of your data directory
port = 3306
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
datadir=data
default-character-set=gbk
init_connect='SET AUTOCOMMIT=0'
default-table-type=InnoDB
init_connect='set completion_type=1'
 
[client]
default-character-set=gbk
------------------------------------
 
二、通过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"
<!--
    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>
 
 
三、写测试类进行测试:
---------------------
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
        //if(HibernateSessionFactory.getSession()==null) System.out.println("null");
       
        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);
       
        Session session = HibernateSessionFactory.getSession();
        Transaction tx=session.beginTransaction();
       
        try {
            session.save(p1);
            tx.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            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.37-win32\bin>mysql -uroot -pleizhimin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.0.37-community MySQL Community Edition (GPL)
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql> use testdb;
Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| card             |
| customers        |
| orders           |
| part             |
| person           |
| t_user           |
| user             |
+------------------+
7 rows in set (0.02 sec)
 
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生成的PO不需要做任何改动,生成的mapping也需要添加一个cascade="save-update"。然后就直接写测试类进行测试。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/30183,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23639 0
一口一口吃掉Hibernate(四)——多对一单向关联映射
      Hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的。一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它。
903 0
Hibernate 一对多配置 级联操作(级联失败问题分析解决)
一方: package com.xdfstar.domain; import java.io.Serializable;import java.util.Date;import java.util.HashSet;import java.
936 0
Hibernate一对一、一对多、多对多注解映射配置
一对一:   一对多:   多对多: 作者: Candyメ奶糖 出处:http://www.cnblogs.com/Candies/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
795 0
Hibernate一对多(多对一)外键设置汇总
  我打算在角色表(role)中添加一个帐号表(account)的外键(accountId),步骤如下: 1、首先在角色表(role)中添加列。          添加语句:alter table role add(accountid varchar2(50));          添加语句时注意事项:单词之间的空格必须为英文空格,不可为中文空格;accountId添加后不可         设为主键! 2、将accountId这一列设为外键,链接角色表(role)和帐号表(account)。
645 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
21341 0
一口一口吃掉Hibernate(五)——一对多单向关联映射
      在上一篇博客《一口一口吃掉Hibernate(四)——多对一单向关联映射》中,介绍了多对一的关联映射,今天就反过来说一下一对多的单向关联映射。       可能有人会对这2篇博客的题目有点混淆不清,跟日常说的关系有点不同。
814 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20943 0
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
上两篇文章说了一对一映射,这里说一下多对一 和 一对多的映射情况。
27 0
13689
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载