hibernate 映射关系(快速原型)_1-阿里云开发者社区

开发者社区> walb呀> 正文

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

简介:
+关注继续查看
此方法在快速建立项目原型上有很大帮助(这最关键的就是速度,用的好原型很快就能建立起来)
先确定下“快速原型”环境定义:
  使用: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,如需转载请自行联系原博主。

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

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
25923 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2526 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
9641 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2124 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11137 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
11687 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
8130 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4454 0
+关注
1038
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载