hibernate 映射关系(快速原型)_1

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
此方法在快速建立项目原型上有很大帮助(这最关键的就是速度,用的好原型很快就能建立起来)
先确定下“快速原型”环境定义:
  使用:ant+hibernate_xdoclet+hibernate_create_table
  过程:定义bean(xdoclet) -> hbm映射文件 -> hibernate.hbm2ddl.auto create -> 逻辑
  注意:如有使用泛型,请使用 > xjavadoc-1.1.jar
build.xml
<? xml version="1.0" encoding="UTF-8" ?>
< project >
    
< property  file ="build-dist.properties"   />

    
< path  id ="class.path" >
        
< fileset  dir ="${ant.lib.dir}" >
            
< include  name ="*.jar"   />
        
</ fileset >
        
< fileset  dir ="${project.lib.dir}" >
            
< include  name ="*.jar"   />
        
</ fileset >
    
</ path >

    
<!--  ===================================================================  -->
    
<!--  Initialise                                                           -->
    
<!--  ===================================================================  -->
    
< target  name ="init" >
        
< taskdef  name ="hibernatedoclet"  classname ="xdoclet.modules.hibernate.HibernateDocletTask"  classpathref ="class.path"   />
    
</ target >

    
<!--  ===================================================================  -->
    
<!--  Invoke XDoclet's hibernate                                           -->
    
<!--  ===================================================================  -->
    
< target  name ="hibernate"  depends ="init" >

        
< echo > +---------------------------------------------------+ </ echo >
        
< echo > |                                                   | </ echo >
        
< echo > | R U N N I N G   H I B E R N A T E D O C L E T     | </ echo >
        
< echo > |                                                   | </ echo >
        
< echo > +---------------------------------------------------+ </ echo >

        
< hibernatedoclet  destdir ="${config.dir}"  mergedir ="${config.dir}"  excludedtags ="@version,@author,@todo,@see"  addedtags ="@xdoclet-generated at ${TODAY},@copyright The XDoclet Team,@author XDoclet,@version ${version}"  force ="${samples.xdoclet.force}"  verbose ="false" >
            
< fileset  dir ="${src.dir}" >
                
< include  name ="bean/**/*.java"   />
            
</ fileset >
            
< hibernate  version ="3.0"   />
        
</ hibernatedoclet >

    
</ target >

</ project >
ant配置文件
# 当然根据你自己的项目路径
ant.lib.dir 
=  C:\\src\\test\\hbmTest\\action\\lib
project.lib.dir
=  C:\\src\\test\\hbmTest\\lib
src.dir 
=  C:\\src\\test\\hbmTest\\src
config.dir 
=  C:\\src\\test\\hbmTest\\config
hibernate.hbm.xml
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>
< hibernate-configuration >
    
< session-factory >
        
< property  name ="hibernate.connection.driver_class" > org.gjt.mm.mysql.Driver </ property >
        
< property  name ="connection.url" >
            
<![CDATA[              
            jdbc:mysql://localhost:3306/hbm?characterEncoding=utf8&connectionCollation=gbk_chinese_ci
            
]]>
        
</ property >
        
< property  name ="hibernate.connection.username" > root </ property >
        
< property  name ="hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ property >
        
< property  name ="hibernate.connection.password" >****** </ property >
        
<property name="hibernate.hbm2ddl.auto">create</property>
        
< property  name ="hibernate.show_sql" > true </ property >
        <!-- 映射添加 -->
        
< mapping  resource ="bean\unidirectional\m2o\Person.hbm.xml" />
        
< mapping  resource ="bean\unidirectional\m2o\Address.hbm.xml" />
        
    
</ session-factory >
</ hibernate-configuration >

下面就详细介绍了第一个
单项一对多
1.先定义bean
package  bean.unidirectional.m2o;
/**
 * @hibernate.class

 
*/
public   class  Person {
    
private   int  id;
    
private  Address address;

    
/**
     * @hibernate.id generator-class = "native"

     
*/
    
public   int  getId() {
        
return  id;
    }

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

    
/**
     * @hibernate.many-to-one column = "addressId" not-null = "true"

     
*/
    
public  Address getAddress() {
        
return  address;
    }

    
public   void  setAddress(Address address) {
        
this .address  =  address;
    }
}
package  bean.unidirectional.m2o;

/**
 * @hibernate.class

 
*/
public   class  Address {
    
private   int  id;

    
/**
     * @hibernate.id generator-class = "native"
     
*/
    
public   int  getId() {
        
return  id;
    }

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

}
2.运行 ant hibernate 得到 hbm 映射文件
3.Main 运行测试
import  java.util.List;

import  org.hibernate.Query;
import  org.hibernate.Session;
import  org.hibernate.Transaction;

import  util.HibernateUtil;
import  bean.unidirectional.m2o.Address;
import  bean.unidirectional.m2o.Person;

public   class  Main {
    
public   static   void  main(String[] args) {
        Session session1 
=  HibernateUtil.currentSession();
        Transaction t1 
=  session1.beginTransaction();
        
// insert
        Address address1  =   new  Address();
        Address address2 
=   new  Address();
        
        Person person1 
=   new  Person();
        Person person2 
=   new  Person();
            person1.setAddress(address1);
            person2.setAddress(address1);
        Person person3 
=   new  Person();
        person3.setAddress(address2);
        
        session1.save(address1);
        session1.save(address2);
        session1.save(person1);
        session1.save(person2);
        session1.save(person3);
        t1.commit();
        
        
// 查询有重复的 address 
        Session session2  =  HibernateUtil.currentSession();
        Query query 
=  session2.createQuery(
                
"  select ta from  " +
                    Address.
class .getName() + "  ta ,  " +
                    Person.
class .getName() + "  tp  " +
                
"  where ta.id=tp.address  " +
                
"  group by ta.id having count(ta.id)>1  "
        );
        
        List
< Address >  list  =   query.list();
        
for (Address atmp : list ){
            System.out.println( atmp.getId() );
        }
    }
}
数据库:
mysql> show tables ;
+-----------------------+
| Tables_in_hbm  |
+-----------------------+
| address             |
| person              |
+-----------------------+
结果:
Hibernate: insert into Address values ( )
Hibernate: insert into Address values ( )
Hibernate: insert into Person (addressId) values (?)
Hibernate: insert into Person (addressId) values (?)
Hibernate: insert into Person (addressId) values (?)
Hibernate: select address0_.id as id from Address address0_, Person person1_ where address0_.id=person1_.addressId group by address0_.id having count(address0_.id)>1
1
当然我这文章主要是映射关系,下面我们就进主题,大家想尝试下可以使用上面的原型快速测试: 参考 (在此我对参考加入了自己的注解,希望能给大家帮助。对于在实际开发中不常见或难以实现的我们就不介绍了)

单向一对一(one to one)

#通过外键关联
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address" 
column="addressId" 
unique="true" not-null="true"/>
</class> <class name="Address">

<id name="id" column="addressId">
<generator class="native"/> </id>
</class>
create table Person ( personId bigint not null primary key, addressId bigint not null unique )

create table Address ( addressId bigint not null primary key )

#通过主键关联(请注意,例子中掉换了关联的方向
<class name
= " Person " >
    <id name
= " id "  column = " personId " >
        <generator class
= " native " />
    </id>
</class>

<class name
= " Address " >
    <id name
= " id "  column = " personId " >
        <generator class
="foreign">
            <param name
="property"
>person</param>
        </generator>

    </id>
    <one-to-one name
= " person "  constrained = " true " />
</class>

create table Person ( personId bigint not null primary key )
create table Address ( personId bigint not null primary key )
        

单向一对多(one to many)

<class name = " Person " >
    <id name
= " id "  column = " personId " >
        <generator class
= " native " />
    </id>
    <set name
="addresses">
        <key column
="personId" not-null="true"/>
        <one-to-many class
="Address"
/>
    </set>

</class>

<class name
= " Address " >
    <id name
= " id "  column = " addressId " >
        <generator class
= " native " />
    </id>
</class>

create table Person ( personId bigint not null primary key )
create table Address ( addressId bigint not null primary key
,  personId bigint not null 
# 这里 当 ddl主键对象 会多出 n条 被外键对象的 update 
# 解决办法修改映射为双向,并且
set-inverse = "false"并且 在代码中‘孩子.set父亲()’和  父亲 .add 孩子 () 一定要写明
# 如果不希望硬代码 就  set- inverse ="true"  父亲 .add 孩子 () ’在生成sql 中就会有多余的update
# 当然根据逻辑情况来选择
/**
 * @hibernate.class
 * 
 
*/
public   class  Person {
    
private   int  id;
    
private  Set < Address >  addresss;
    
    
/**
     * @hibernate.id 
     *   generator-class = "native"
     * 
@return
     
*/
    
public   int  getId() {
        
return  id;
    }

    
public   void  setId( int  id) {
        
this .id  =  id;
    }
    
    
/**
     * @hibernate.set inverse = "false" 
     *     @hibernate.collection-key column ="personId"
     *  @hibernate.collection-one-to-many class = "bean.unidirectional.m2o.Address" 
     
*/
    
public  Set < Address >  getAddresss() {
        
return  addresss;
    }

    
public   void  setAddresss(Set < Address >  addresss) {
        
this .addresss  =  addresss;
    }


}

/**
 * @hibernate.class
 * 
@author  root
 * 
 
*/
public   class  Address {
    
private   int  id;
    
private  Person person ;
    
    
/**
     * @hibernate.id generator-class = "native"
     
*/
    
public   int  getId() {
        
return  id;
    }

    
public   void  setId( int  id) {
        
this .id  =  id;
    }
    
/**
     * @hibernate.many-to-one 
     *     column = "personId"
     * 
@return
     
*/
    
public  Person getPerson() {
        
return  person;
    }

    
public   void  setPerson(Person person) {
        
this .person  =  person;
    }
    

}

    
public   static   void  main(String[] args) {
        Session session1 
=  HibernateUtil.currentSession();
        Transaction t1 
=  session1.beginTransaction();
        
// insert
        Address address1  =   new  Address();
        Address address2 
=   new  Address();
        Set
< Address >  addresss  =   new  HashSet < Address > ();
        addresss.add(address1);
        addresss.add(address2);
        
        Person person1 
=   new  Person();
            person1.setAddresss(addresss);
        
        address1.setPerson(person1);
        address2.setPerson(person1);
        
        session1.save(person1);        
        session1.save(address1);
        session1.save(address2);

        t1.commit();
        
        
// 查询有重复的 address 
        Session session2  =  HibernateUtil.currentSession();
        Query query 
=  session2.createQuery(
                
"   from  " + Person. class .getName() + "  tp  "
        );
        
        List
< Person >  list  =   query.list();
        
for (Person ptmp : list ){
            
for ( Address atmp : ptmp.getAddresss() ){
                System.out.println(atmp.getId());
            }
        }
结果: 干净的 insert 
Hibernate:  insert   into  Person  values  ( )
Hibernate: 
insert   into  Address  values  ( )
Hibernate: 
insert   into  Address  values  ( )
Hibernate: 
select  person0_.id  as  id  from  Person person0_
1
2
mysql :
mysql> select * from address ;
+----+----------+
| id | personId |
+----+----------+
|  1 |        1 |
|  2 |        1 |
+----+----------+

2 rows in set (0.00 sec)

本文转自博客园刘凯毅的博客,原文链接:hibernate 映射关系(快速原型)_1,如需转载请自行联系原博主。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
SQL Java 数据库连接
2021-08-05mapper代理,几种pojo输入输出,pojo扩展通过扩展继承,映射主键普通属性映射,动态SQL,逆向工程
2021-08-05mapper代理,几种pojo输入输出,pojo扩展通过扩展继承,映射主键普通属性映射,动态SQL,逆向工程
45 0
|
11月前
|
SQL Java 关系型数据库
MyBatis处理表字段和实体类属性名不一致的情况及多对一映射关系的处理
MyBatis处理表字段和实体类属性名不一致的情况及多对一映射关系的处理
150 0
|
Java 数据库连接 mybatis
【MyBatis】学习笔记12:通过级联属性赋值解决多对一的映射关系
【MyBatis】学习笔记12:通过级联属性赋值解决多对一的映射关系
116 0
【MyBatis】学习笔记12:通过级联属性赋值解决多对一的映射关系
|
SQL Java 数据库连接
Hibernate【映射】知识要点(三)
Hibernate【映射】知识要点
91 0
Hibernate【映射】知识要点(三)
|
Java 数据库连接 数据库
Hibernate【映射】知识要点(一)
Hibernate【映射】知识要点
97 0
Hibernate【映射】知识要点(一)
|
SQL Java 数据库连接
Hibernate【映射】知识要点(二)
Hibernate【映射】知识要点
122 0
Hibernate【映射】知识要点(二)
|
Java 数据库连接 数据库
Hibernate【映射】知识要点(四)
Hibernate【映射】知识要点
105 0
Hibernate【映射】知识要点(四)
|
SQL Java 数据库连接
Hibernate【映射】续篇(三)
Hibernate【映射】续篇
109 0
Hibernate【映射】续篇(三)
|
Java 数据库连接 数据库
Hibernate【映射】续篇(一)
Hibernate【映射】续篇
84 0
Hibernate【映射】续篇(一)
|
Java 数据库连接 数据库
Hibernate【映射】续篇(二)
Hibernate【映射】续篇
93 0
Hibernate【映射】续篇(二)