`
hhr_michael
  • 浏览: 72582 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

struts2+hibernate3+spring2读书笔记10(Hibernate配置文件)

阅读更多
                                        第11章 Hibernate配置文件   

一. 配置hibernate.cfg.xml
Hibernate运行时需要获取一些数据库的基本信息,包括数据库URL、数据库用户名、数据库密码、数据库JDBC驱动类和数据库dialect等。
1.几种常用数据库的hibernate.cfg.xml配置
(1) mysql

<?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>
    	<!-- 在后台打印sql语句 -->
    	<property name="show_sql">true</property>
    	<!-- 指定sql的本地方言,根据连接的数据库确定-->
    	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>   
    	<!-- 指定jdbc url,MySql的默认端口为3306,127.0.0.1为需要连接的主机,testhibernate为连接的数据库 -->
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/testhibernate</property>
        <!-- 数据库的用户名 -->   
        <property name="connection.username">root</property>
        <!-- 数据库的密码 -->   
        <property name="connection.password"> </property>
        <!-- 设定数据库的驱动类,MySql的驱动jar包为mysql-connector-java-5.0.4-bin.jar,驱动类为com.mysql.jdbc.Driver -->   
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 设定事务管理的工厂类 -->
        <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
        
        <!--指定0到多个hbm.xml映射文件-->
        <mapping resource="amigo/hibernate/User.hbm.xml" />
        <mapping resource="amigo/hibernate/Dept.hbm.xml" />
    </session-factory>
</hibernate-configuration>   



(2)SQL Server


<?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>
    	<!-- 在后台打印sql语句 -->
    	<property name="show_sql">true</property>
    	<!-- 指定sql的本地方言,根据连接的数据库确定-->
    	<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>   
    	<!-- 指定jdbc url,SqlServer的默认端口为1433,192.168.1.124为需要连接的主机,testhibernate为连接的数据库 -->
        <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433/testhibernate</property>
        <!-- 数据库的用户名 -->   
        <property name="connection.username">sa</property>
        <!-- 数据库的密码 -->   
        <property name="connection.password">sa</property>
        <!-- 设定数据库的驱动类,SqlServer的驱动jar包为jtds-1.2.jar,驱动类为net.sourceforge.jtds.jdbc.Driver -->   
        <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
        <!-- 设定JDBC连接池的大小(使用内置的连接池) -->   
  		<property name="connection.pool_size">1</property>   
  		<!-- 确定以何种方式产生Session,可为jdbc和jta -->   
  		<property name="current_session_context_class">thread</property>   
  		<!-- 不使用缓存  -->   
  		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        
        <!--指定0到多个hbm.xml映射文件-->
        <mapping resource="amigo/hibernate/User.hbm.xml" />
        <mapping resource="amigo/hibernate/Dept.hbm.xml" />
    </session-factory>
</hibernate-configuration>   


(3)Oracle

  
<?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>
    	<!-- 在后台打印sql语句 -->
    	<property name="show_sql">true</property>
    	<!-- 指定sql的本地方言,根据连接的数据库确定-->
    	<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>   
    	<!-- 指定jdbc url,Oracle的默认端口为1521,127.0.0.1为需要连接的主机,testhibernate为连接的数据库 -->
        <property name="connection.url">jdbc:oracle:thin:@ 127.0.0.1:1521:testhibernate</property>
        <!-- 数据库的用户名 -->   
        <property name="connection.username">test</property>
        <!-- 数据库的密码 -->   
        <property name="connection.password">test</property>
        <!-- 设定数据库的驱动类,Oracle的驱动jar包为ojdbc14.jar,驱动类为oracle.jdbc.driver.OracleDriver -->   
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <!-- 设定JDBC连接池的大小(使用内置的连接池) -->   
  		<property name="connection.pool_size">1</property>   
  		<!-- 确定以何种方式产生Session,可为jdbc和jta -->   
  		<property name="current_session_context_class">thread</property>   
  		<!-- 不使用缓存  -->   
  		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        
        <!--指定0到多个hbm.xml映射文件-->
        <mapping resource="amigo/hibernate/User.hbm.xml" />
        <mapping resource="amigo/hibernate/Dept.hbm.xml" />
    </session-factory>
</hibernate-configuration>   


2.hibernate.cfg.xml连接配置
  (1)JNDI连接池

  
 <?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>
    	<!-- 在后台打印sql语句 -->
    	<property name="show_sql">true</property>
    	<!-- 指定sql的本地方言,根据连接的数据库确定-->
    	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>   
    	<!-- 一次读的数据库记录数 -->
		<property name="jdbc.fetch_size">50</property>
		<!-- 设定对数据库进行批量删除 -->
       <property name="jdbc.batch_size">30</property>
		<!-- 配置JNDI数据源,其中jdbc/testhibernate为JDNI数据源的名称 -->
		<property name="connection.datasource">java:comp/env/jdbc/testhibernate</property>
		<!-- Hibernate的连接加载类 -->
		<property name="connection.provider_class">org.hibernate.connection.DatasourceConnectionProvider</property>
        
        <!--指定0到多个hbm.xml映射文件-->
        <mapping resource="amigo/hibernate/User.hbm.xml" />
        <mapping resource="amigo/hibernate/Dept.hbm.xml" />
    </session-factory>
</hibernate-configuration>  

(2) C3PO连接池
        <?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>
    	<!-- 在后台打印sql语句 -->
    	<property name="show_sql">true</property>
         <!-- SQL方言,设定的是MySQL方言 -->
         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
       	 <!--MySql驱动程序,sqlserver和Oracle驱动类的配置请参考前面的内容 -->
      	 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
       	 <!-- JDBC URL -->
         <property name="connection.url">jdbc:mysql://127.0.0.1:3306/testhibernate</property>
         <!-- 数据库用户名 -->
         <property name="connection.username">root</property>
         <!-- 数据库密码 -->
         <property name="connection.password">root</property>
         <!-- 设定最小连接数-->
         <property name="c3p0.min_size">5</property>
         <!-- 设定最大连接数-->
         <property name="c3p0.max_size">20</property>
         <!-- 设定延迟所允许的时间(ms)-->
         <property name="c3p0.timeout">1800</property>
         <!-- 设定缓存所允许的最大连接数-->
         <property name="c3p0.max_statements">50</property>
        
        <!--指定0到多个hbm.xml映射文件-->
        <mapping resource="amigo/hibernate/User.hbm.xml" />
        <mapping resource="amigo/hibernate/Dept.hbm.xml" />
    </session-factory>
</hibernate-configuration>  


(3)dpcp连接池

 <?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 2.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
    <session-factory>
    	<!-- 在后台打印sql语句 -->
    	<property name="show_sql">true</property>
         <!-- SQL方言,设定的是MySQL方言 -->
         <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
         <!-- 指定驱动类,本配置实例MySql,SqlServer和Oracle的配置请参考前续内容 -->
         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- JDBC URL -->
         <property name="connection.url">jdbc:mysql://127.0.0.1:3306/testhibernate</property>
         <!-- 数据库用户名 -->
         <property name="connection.username">root</property>
         <!-- 数据库密码-->
         <property name="connection.password">root</property>
         <!-- 设定dbcp数据源的最大连接数 -->
         <property name="dbcp.maxActive">50</property> 
         <property name="dbcp.whenExhaustedAction">1</property>
         <!-- 设定dbcp数据源的最大等待数 -->
         <property name="dbcp.maxWait">500</property> 
         <!-- 设定dbcp数据源的最大闲置数 -->
         <property name="dbcp.maxIdle">10</property>
        
        <!--指定0到多个hbm.xml映射文件-->
        <mapping resource="amigo/hibernate/User.hbm.xml" />
        <mapping resource="amigo/hibernate/Dept.hbm.xml" />
    </session-factory>
</hibernate-configuration>


二. Hbm.xml文件基本配置

1. 映射文件的文档类型定义(DTD)
(1) hibernate-mapping根元素,该元素可存在0到多个meta、typedef、import等元素,它的具体属性如下:
 default-cascade:设置默认的层叠样式
 default-lazy:设定默认的延迟加载方式
 package:该属性用于设置包的类名,在默认情况下,hibernate-mapping 的子元素class需要提供完整的类名,当有多个class文件或class中包含了很多关联映射时,这种方式很烦锁。若设定了hibernate-mapping的package的值,则将简化一部分工作。

(2) class元素,它常用的属性如下:
 name:类名,当未指定package时,类名需要将包的全部路径包含在内,否则只需给出类名
 table: 对应的数据表的名称,例如SEC_USER
 schema:设置命名空间。
   
(3) id元素(主键能为空,主键必须唯一,主键值永远不变),它常用属性如下:
 name:在映射的pojo类中的名称。
 colum:在数据库的表中对应的字段名称
 type:对应的pojo类中的类型

MySQL中自增主键的配置如下:

 <id name=”roleid” column=”roleId” type=”java.lang.Integer”>
  <generator class=”native”/>
  </id>


Generator的class指定为native,表示将根据本地数据的设置来创建roleid,若MySQL中将其表的roleId字段设置为自增,则在保存记录时,roleid将自动增长。
对于需要在程序中指定主键的值,可将generator的class属性设置为assgined,代码如下:
 
<id name=”loginname” column=”loginName” type=”java.lang.String”>
  <generator class=”assigned”/>
  </id>


对于oracle数据库,需要通过设定序列来实现主键的自增,若数据中设置了一个名为SEQ_ALL的自增序列,需要为某表指定id为该序列,配置实例如下:
 <id name=”id” column=”ID” unsaved-value=”null”>
<generator class =”sequence”>
<param name=”sequence”>USER_SEQ</param>
</generator>
</id>

 
          (4)composite-id元素
             该元素用于设定组合id构成的主键,具体实例代码如下:
            
          
  <composite-id>
				<key-property name=”userId” column=”user_ID” type=”java.lang.long”>
				<key-property name=”roleId” column=”role_ID” type=”java.lang.logn”>
</composite-id>


(5)property元素
Property元素用于配置某个属性,它是使用最多的一个元素,具体属性如下:
 name:该属性表示pojo对应的属性名称
 column:在数据库表中对应的字段名称
 type:在pojo类中的类型
 not-null:指定是否可为空,值可为true或false,默认为false,即允许为空
 length:当为String类型的属性时,指定字符串的长度
 insert:指定该字段是否永远不能被插入,值可为true或false,默认为true,即可被插入
 update:指定该字段是否永远不能被更新,值可为true或false,默认为true,即可被更新
         
          例如在User表中包含了一个password(密码)字段,它的类型为String,不能为空,且长度只能小于50,则该属性的配置实例如下:
<property name=”password” column=”PASSWORD” type=”java.lang.string” not-null=”true” length=”50”/>
         若需要为某表的cx字段指定property属性,配置如下:
          
 <property name=”cy” type=”java.math.BigDecimal”>
				<column name=”CY” precision=”ss” scale=”0”/>
</property>


2. Tb1_user、tb1_dept表的结构(要用到的数据库的表)

     
CREATE DATABASE testhibernate;
USE testhibernate;

#创建部门信息表
 CREATE TABLE tb1_dept(
	deptId bigint(20) not null auto_increment COMMENT '部门id(自增)',
	parentDeptId bigint(20) not null COMMENT '父级部门id,最高层部门的父级部门id为0',
	depName varchar(50) not null COMMENT '部门名称',
	deptFullName varchar(100) default null COMMENT '部门全名',
	state tinyint(1) not null COMMENT '状态(0:未启用,1:启用)',
	description varchar(255) default null COMMENT '描述信息',
	creator varchar(50) default null COMMENT '创建人',
	createTime datetime default null COMMENT '创建时间',
	PRIMARY KEY(deptId)
)ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='部门信息表';


#创建用户信息表
 CREATE TABLE tb1_user(
	loginName varchar(50) not null COMMENT '账户id,用户登录名',
	deptId bigint(20) not null COMMENT '所属组织id',
	name varchar(50) not null COMMENT '账户名称',
	password varchar(50) not null COMMENT '账户密码',
	mobile varchar(20) default null COMMENT '账户手机号',
	telephone varchar(20) default null COMMENT '电话机号',
	email varchar(100) default null COMMENT '邮箱地址',
	createTime datetime not null COMMENT '账户创建时间',
	lastLoginTime datetime default null COMMENT '最后登录时间',
	LoginTimes bigint(20) not null COMMENT '登录次数',
	state tinyint(1) not null COMMENT '用户状态(0:未启用,1:启用)',
	description varchar(255) default null COMMENT '账户简述',
	PRIMARY KEY(loginName),
	KEY FK_orgId_user_organization(deptId)
)ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='账户信息表';

#将用户信息表的deptId与部门信息表的主键id建立外键关联
	ALTER TABLE tb1_user
	ADD FOREIGN KEY(deptId) REFERENCES tb1_dept(deptId);



3. 编写tb1_dept表对应的pojo类:Dept.java 代码如下:

      
 package amigo.hibernate.configure;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 部门信息表对应的pojo类.
 */
public class Dept implements Serializable {
	private static final long serialVersionUID = 1L;

	/** 部门id(自增). */
	private java.lang.Long deptid;

	/** 父级部门id,最高层部门的父级部门id为0. */
	private java.lang.Long parentdeptid;

	/** 部门名称. */
	private java.lang.String deptname;

	/** 部门全名. */
	private java.lang.String deptfullname;

	/** 状态(0:未启用,1:启用). */
	private java.lang.Byte state;

	/** 描述信息. */
	private java.lang.String description;

	/** 创建人. */
	private java.lang.String creator;

	/** 创建时间. */
	private java.util.Date createtime;
	
	/** 该部门关联的用户对象. */
	private Set<User> users = new HashSet<User>();
	
	public Set<User> getUsers() {
		return users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}

	public java.lang.Long getDeptid() {
		return deptid;
	}

	public void setDeptid(java.lang.Long deptid) {
		this.deptid = deptid;
	}

	public java.lang.Long getParentdeptid() {
		return parentdeptid;
	}

	public void setParentdeptid(java.lang.Long parentdeptid) {
		this.parentdeptid = parentdeptid;
	}

	public java.lang.String getDeptname() {
		return deptname;
	}

	public void setDeptname(java.lang.String deptname) {
		this.deptname = deptname;
	}

	public java.lang.String getDeptfullname() {
		return deptfullname;
	}

	public void setDeptfullname(java.lang.String deptfullname) {
		this.deptfullname = deptfullname;
	}

	public java.lang.Byte getState() {
		return state;
	}

	public void setState(java.lang.Byte state) {
		this.state = state;
	}

	public java.lang.String getDescription() {
		return description;
	}

	public void setDescription(java.lang.String description) {
		this.description = description;
	}

	public java.lang.String getCreator() {
		return creator;
	}

	public void setCreator(java.lang.String creator) {
		this.creator = creator;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}
}

4. 编写tb1_dept表映射文件:Dept.hbm.xml

         
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure">
    <class name="Dept" table="tbl_dept">
        <id name="deptd" column="deptId" type="java.lang.Long">
            <generator class="native"/>
        </id>
 
        <property name="parentdeptid" column="parentDeptId" type="java.lang.Long"  not-null="true" />
        <property name="deptname" column="deptName" type="java.lang.String"  not-null="true" />
        <property name="deptfullname" column="deptFullName" type="java.lang.String" />
        <property name="state" column="state" type="java.lang.Byte"  not-null="true" />
        <property name="description" column="description" type="java.lang.String" />
        <property name="creator" column="creator" type="java.lang.String" />
        <property name="createtime" column="createTime" type="java.util.Date" />
    </class>
</hibernate-mapping>


5.编写tb1_user表对应的pojo类:User.java

 
 package amigo.hibernate.configure;

import java.io.Serializable;

/**
 * 用户信息的POJO类.
 */
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	
    /** 用户名,主键. */
    private java.lang.String loginname;

    /** 部门. */
    private Dept dept;

    /** 帐户姓名. */
    private java.lang.String name;

    /** 登录密码. */
    private java.lang.String password;

    /** 帐户手机号. */
    private java.lang.String mobile;

    /** 电话号码. */
    private java.lang.String telephone;

    /** 邮箱地址. */
    private java.lang.String email;

    /** 帐户创建时间. */
    private java.util.Date createtime;

    /** 最后登录时间. */
    private java.util.Date lastlogintime;

    /** 登录次数. */
    private java.lang.Long logintimes;

    /** 用户状态(0:未启用,1:启用)*/
    private java.lang.Byte state;

    /** 帐户简述. */
    private java.lang.String description;

	public java.lang.String getLoginname() {
		return loginname;
	}

	public void setLoginname(java.lang.String loginname) {
		this.loginname = loginname;
	}

	public Dept getDept() {
		return dept;
	}

	public void setDept(Dept dept) {
		this.dept = dept;
	}

	public java.lang.String getName() {
		return name;
	}

	public void setName(java.lang.String name) {
		this.name = name;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.lang.String getMobile() {
		return mobile;
	}

	public void setMobile(java.lang.String mobile) {
		this.mobile = mobile;
	}

	public java.lang.String getTelephone() {
		return telephone;
	}

	public void setTelephone(java.lang.String telephone) {
		this.telephone = telephone;
	}

	public java.lang.String getEmail() {
		return email;
	}

	public void setEmail(java.lang.String email) {
		this.email = email;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}

	public java.util.Date getLastlogintime() {
		return lastlogintime;
	}

	public void setLastlogintime(java.util.Date lastlogintime) {
		this.lastlogintime = lastlogintime;
	}

	public java.lang.Long getLogintimes() {
		return logintimes;
	}

	public void setLogintimes(java.lang.Long logintimes) {
		this.logintimes = logintimes;
	}

	public java.lang.Byte getState() {
		return state;
	}

	public void setState(java.lang.Byte state) {
		this.state = state;
	}

	public java.lang.String getDescription() {
		return description;
	}

	public void setDescription(java.lang.String description) {
		this.description = description;
	}
}


6.tb1_user表映射文件:User.hbm.xml

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure">
    <class name="User" table="tbl_user">
        <id name="loginname" column="loginName" type="java.lang.String">
            <generator class="assigned"/>
        </id>
        <property name="name" column="name" type="java.lang.String"  not-null="true" />
        <property name="password" column="password" type="java.lang.String"  not-null="true" />
        <property name="mobile" column="mobile" type="java.lang.String" />
        <property name="telephone" column="telephone" type="java.lang.String" />
        <property name="email" column="email" type="java.lang.String" />
        <property name="createtime" column="createTime" type="java.util.Date"  not-null="true" />
        <property name="lastlogintime" column="lastLoginTime" type="java.util.Date" />
        <property name="logintimes" column="loginTimes" type="java.lang.Long"  not-null="true" />
        <property name="state" column="state" type="java.lang.Byte"  not-null="true" />
        <property name="description" column="description" type="java.lang.String" />
        
        <many-to-one name="dept"
        		column="deptId"
        		class="Dept"
        		not-null="true" />
    </class>
</hibernate-mapping>



三. 配置一对多关联

1. 多对一关联配置,配置User.java和User.hbm.xml

 User.java
        
    

       
package amigo.hibernate.configure.onetomany;

import java.io.Serializable;

/**
 * 用户信息的POJO类.
 */
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	
    /** 用户名,主键. */
    private java.lang.String loginname;

    /** 部门. */
    private Dept dept;

    /** 帐户姓名. */
    private java.lang.String name;

    /** 登录密码. */
    private java.lang.String password;

    /** 帐户手机号. */
    private java.lang.String mobile;

    /** 电话号码. */
    private java.lang.String telephone;

    /** 邮箱地址. */
    private java.lang.String email;

    /** 帐户创建时间. */
    private java.util.Date createtime;

    /** 最后登录时间. */
    private java.util.Date lastlogintime;

    /** 登录次数. */
    private java.lang.Long logintimes;

    /** 用户状态(0:未启用,1:启用)*/
    private java.lang.Byte state;

    /** 帐户简述. */
    private java.lang.String description;

	public java.lang.String getLoginname() {
		return loginname;
	}

	public void setLoginname(java.lang.String loginname) {
		this.loginname = loginname;
	}

	public Dept getDept() {
		return dept;
	}

	public void setDept(Dept dept) {
		this.dept = dept;
	}

	public java.lang.String getName() {
		return name;
	}

	public void setName(java.lang.String name) {
		this.name = name;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.lang.String getMobile() {
		return mobile;
	}

	public void setMobile(java.lang.String mobile) {
		this.mobile = mobile;
	}

	public java.lang.String getTelephone() {
		return telephone;
	}

	public void setTelephone(java.lang.String telephone) {
		this.telephone = telephone;
	}

	public java.lang.String getEmail() {
		return email;
	}

	public void setEmail(java.lang.String email) {
		this.email = email;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}

	public java.util.Date getLastlogintime() {
		return lastlogintime;
	}

	public void setLastlogintime(java.util.Date lastlogintime) {
		this.lastlogintime = lastlogintime;
	}

	public java.lang.Long getLogintimes() {
		return logintimes;
	}

	public void setLogintimes(java.lang.Long logintimes) {
		this.logintimes = logintimes;
	}

	public java.lang.Byte getState() {
		return state;
	}

	public void setState(java.lang.Byte state) {
		this.state = state;
	}

	public java.lang.String getDescription() {
		return description;
	}

	public void setDescription(java.lang.String description) {
		this.description = description;
	}
}
  

 
 User.hbm.xml

  
 <?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.onetomany">
    <class name="User" table="tbl_user">
        <id name="loginname" column="loginName" type="java.lang.String">
            <generator class="assigned"/>
        </id>
        <property name="name" column="name" type="java.lang.String"  not-null="true" />
        <property name="password" column="password" type="java.lang.String"  not-null="true" />
        <property name="mobile" column="mobile" type="java.lang.String" />
        <property name="telephone" column="telephone" type="java.lang.String" />
        <property name="email" column="email" type="java.lang.String" />
        <property name="createtime" column="createTime" type="java.util.Date"  not-null="true" />
        <property name="lastlogintime" column="lastLoginTime" type="java.util.Date" />
        <property name="logintimes" column="loginTimes" type="java.lang.Long"  not-null="true" />
        <property name="state" column="state" type="java.lang.Byte"  not-null="true" />
        <property name="description" column="description" type="java.lang.String" />
        
        <many-to-one name="dept"
        		column="deptId"
        		class="Dept"
        		not-null="true" />
    </class>
</hibernate-mapping>



备注:<many-to-one../>元素的常用属性
 name:持久化类中的属性名,在本例中为User.java中的dept属性
 column:设定与持久化类的属性对应的关系数据库表中的关键,在本例中为deptId
 class: 对应的持久化类,在本例中为Dept
 not-null:该属性是否允许为空,值可为true或false.当为true时,表示该属性不允许为null,默认为false.


2. 一对多关联关系配置—配置Dept.java和Dept.hbm.xml

 Dept.java

            
  package amigo.hibernate.configure.onetomany;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 部门信息表对应的pojo类.
 */
public class Dept implements Serializable {
	private static final long serialVersionUID = 1L;

	/** 部门id(自增). */
	private java.lang.Long deptid;

	/** 父级部门id,最高层部门的父级部门id为0. */
	private java.lang.Long parentdeptid;

	/** ��部门名称. */
	private java.lang.String deptname;

	/** 部门全名. */
	private java.lang.String deptfullname;

	/** 状态(0:未启用,1:启用). */
	private java.lang.Byte state;

	/** 描述信息. */
	private java.lang.String description;

	/** 创建人. */
	private java.lang.String creator;

	/** 创建时间. */
	private java.util.Date createtime;
	
	/** 该部门关联的用户对象. */
	private Set<User> users = new HashSet<User>();
	
	public Set<User> getUsers() {
		return users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}

	public java.lang.Long getDeptid() {
		return deptid;
	}

	public void setDeptid(java.lang.Long deptid) {
		this.deptid = deptid;
	}

	public java.lang.Long getParentdeptid() {
		return parentdeptid;
	}

	public void setParentdeptid(java.lang.Long parentdeptid) {
		this.parentdeptid = parentdeptid;
	}

	public java.lang.String getDeptname() {
		return deptname;
	}

	public void setDeptname(java.lang.String deptname) {
		this.deptname = deptname;
	}

	public java.lang.String getDeptfullname() {
		return deptfullname;
	}

	public void setDeptfullname(java.lang.String deptfullname) {
		this.deptfullname = deptfullname;
	}

	public java.lang.Byte getState() {
		return state;
	}

	public void setState(java.lang.Byte state) {
		this.state = state;
	}

	public java.lang.String getDescription() {
		return description;
	}

	public void setDescription(java.lang.String description) {
		this.description = description;
	}

	public java.lang.String getCreator() {
		return creator;
	}

	public void setCreator(java.lang.String creator) {
		this.creator = creator;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}
}



 Dept.hbm.xml

             
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.onetomany">
    <class name="Dept" table="tbl_dept">
        <id name="deptid" column="deptId" type="java.lang.Long">
            <generator class="native"/>
        </id>
 
        <property name="parentdeptid" column="parentDeptId" type="java.lang.Long"  not-null="true" />
        <property name="deptname" column="deptName" type="java.lang.String"  not-null="true" />
        <property name="deptfullname" column="deptFullName" type="java.lang.String" />
        <property name="state" column="state" type="java.lang.Byte"  not-null="true" />
        <property name="description" column="description" type="java.lang.String" />
        <property name="creator" column="creator" type="java.lang.String" />
        <property name="createtime" column="createTime" type="java.util.Date" />
        
        <set name="users" cascade ="save-update">
			<key>
        		<column name="deptId" />
    		</key>
    		<one-to-many class="User" />
		</set>
    </class>
</hibernate-mapping>


备注:在映射关系中,一对多的关联采用<set../>其具体属性如下:
 name:设定持久化类的属性名,在本例中为users
 cascade:表示级联的属性,若设置为“save-update”,表示级联保存和更新
 order-by:设定取得的集合的排序方式,若设置为loginName,表示按照用户对象的loginName属性进行排序
 lazy:是否为立即加载,值可为true或false,当设置为true时,表示立即加载集合对象,默认值为false.

四. 配置一对一关联

1. 配置一对一“主键关联”

(1) 编写数据库脚本scripts-one-to-one-way1.sql
            具体脚本如下:

            
 CREATE DATABASE `testhiberante`;
USE `testhiberante`;

#创建用户信息表
CREATE TABLE `tbl_user` (
  `loginName` varchar(50) NOT NULL COMMENT '用户登录名',
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `password` varchar(50) NOT NULL COMMENT '登录密码',
  `createTime` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY  (`loginName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='用户信息表';

#创建用户附加信息表
CREATE TABLE `tbl_user_ext` (
  `loginName` varchar(50) NOT NULL COMMENT '用户登录名',
  `mobile` varchar(20) default NULL COMMENT '帐户手机号',
  `telephone` varchar(20) default NULL COMMENT '电话号码',
  `email` varchar(100) default NULL COMMENT '邮箱地址',
  `address` varchar(100) default NULL COMMENT '地址',
  `fax` varchar(100) default NULL COMMENT '传真',
  `blog` varchar(100) default NULL COMMENT 'blog地址'
  PRIMARY KEY  (`loginName`),
  KEY `FK_loginName_user_userext` (`loginName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='用户附加信息表';

#将用户附加信息表的主键loginName与用户信息表的主键loginName建立外键关联
ALTER TABLE `tbl_user_ext`
ADD FOREIGN KEY (`loginName`) REFERENCES `tbl_user` (`loginName`);


(2)编写User.java 代码如下:

package amigo.hibernate.configure.onetoone.way1;

import java.io.Serializable;

/**
 * 用户信息的POJO类.
 */
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	
    /** 用户名,主键. */
    private java.lang.String loginname;

    /** 帐户姓名. */
    private java.lang.String name;

    /** 登录密码. */
    private java.lang.String password;

    /** 创建时间. */
    private java.util.Date createtime;
    
    /** 与用户附加信息存在一对的关联关系. */
    private UserExt userExt;

	public java.lang.String getLoginname() {
		return loginname;
	}

	public void setLoginname(java.lang.String loginname) {
		this.loginname = loginname;
	}

	public java.lang.String getName() {
		return name;
	}

	public void setName(java.lang.String name) {
		this.name = name;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}

	public UserExt getUserExt() {
		return userExt;
	}

	public void setUserExt(UserExt userExt) {
		this.userExt = userExt;
	}
}


(3)配置User.hbm.xml

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.onetoone.way1">
    <class name="User" table="tbl_user">
        <id name="loginname" column="loginName" type="java.lang.String">
            <generator class="assigned"/>
        </id>
        <property name="name" column="name" type="java.lang.String"  not-null="true" />
        <property name="password" column="password" type="java.lang.String"  not-null="true" />
        <property name="createtime" column="createTime" type="java.util.Date"  not-null="true" />
        
        <one-to-one name="userExt" 
        	class="UserExt" 
        	cascade="all" /> 
    </class>
</hibernate-mapping>


(4)编写UserExt.java

package amigo.hibernate.configure.onetoone.way1;

import java.io.Serializable;

/**
 * 用户附加信息的POJO类.
 */
public class UserExt implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/** 用户信息,UserExt与User存在一对一的“主键关联”关系. */
	private User user;
	
	 /** 手机号. */
    private java.lang.String mobile;

    /** 电话号码. */
    private java.lang.String telephone;

    /** 邮箱地址. */
    private java.lang.String email;
	
	/** 地址. */
	private String address;
	
	/** 传真. */
	private String fax;
	
	/** blog地址. */
	private String blog;

	public java.lang.String getMobile() {
		return mobile;
	}

	public void setMobile(java.lang.String mobile) {
		this.mobile = mobile;
	}

	public java.lang.String getTelephone() {
		return telephone;
	}

	public void setTelephone(java.lang.String telephone) {
		this.telephone = telephone;
	}

	public java.lang.String getEmail() {
		return email;
	}

	public void setEmail(java.lang.String email) {
		this.email = email;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getFax() {
		return fax;
	}

	public void setFax(String fax) {
		this.fax = fax;
	}

	public String getBlog() {
		return blog;
	}

	public void setBlog(String blog) {
		this.blog = blog;
	}
}


(5)配置UserExt.hbm.xml

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.onetoone.way1">
    <class name="UserExt" table="tbl_user_ext">
    	<id name="id" column="id">
			<generator class="foreign">
            	<param name="property">user</param>
            </generator>
        </id>
    	
        <property name="mobile" column="mobile" type="java.lang.String" />
        <property name="telephone" column="telephone" type="java.lang.String" />
        <property name="email" column="email" type="java.lang.String" />
        <property name="address" column="address" type="java.lang.String" />
        <property name="fax" column="fax" type="java.lang.String" />
        <property name="blog" column="blog" type="java.lang.String" />
        
        <one-to-one name="user" 
        	class="User" 
        	constrained="true" /> 
    </class>
</hibernate-mapping>



2. 一对一“唯一处键关联”配置

(1) 数据库脚本

CREATE DATABASE `testhiberante`;
USE `testhiberante`;

#创建用户信息表
CREATE TABLE `tbl_user` (
  `loginName` varchar(50) NOT NULL COMMENT '用户登录名',
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `password` varchar(50) NOT NULL COMMENT '登录密码',
  `createTime` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY  (`loginName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='用户信息表';

#创建用户附加信息表
CREATE TABLE `tbl_user_ext` (
   ‘extId’ bigint(20) NOT NULL auto_increment COMMENT ‘主键ID自增’
  `loginName` varchar(50) NOT NULL COMMENT '用户登录名',
  `mobile` varchar(20) default NULL COMMENT '帐户手机号',
  `telephone` varchar(20) default NULL COMMENT '电话号码',
  `email` varchar(100) default NULL COMMENT '邮箱地址',
  `address` varchar(100) default NULL COMMENT '地址',
  `fax` varchar(100) default NULL COMMENT '传真',
  `blog` varchar(100) default NULL COMMENT 'blog地址'
  PRIMARY KEY  (`loginName`),
  KEY `FK_loginName_user_userext` (`loginName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='用户附加信息表';

#将用户附加信息表的主键loginName与用户信息表的主键loginName建立外键关联
ALTER TABLE `tbl_user_ext`
ADD FOREIGN KEY (`loginName`) REFERENCES `tbl_user` (`loginName`);


(2) 编写UserExt.java

    
 package amigo.hibernate.configure.onetoone.way2;

import java.io.Serializable;

/**
 * 用户附加信息的POJO类.
 */
public class UserExt implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/** 附加信息的id. */
	private Long extId;
	
	/** 用户信息,UserExt与User存在一对一的关联关系. */
	private User user;
	
	 /** 手机号. */
    private java.lang.String mobile;

    /** 电话号码. */
    private java.lang.String telephone;

    /** 邮箱地址. */
    private java.lang.String email;
	
	/** 地址. */
	private String address;
	
	/** 传真. */
	private String fax;
	
	/** blog地址. */
	private String blog;

	public java.lang.String getMobile() {
		return mobile;
	}

	public void setMobile(java.lang.String mobile) {
		this.mobile = mobile;
	}

	public java.lang.String getTelephone() {
		return telephone;
	}

	public void setTelephone(java.lang.String telephone) {
		this.telephone = telephone;
	}

	public java.lang.String getEmail() {
		return email;
	}

	public void setEmail(java.lang.String email) {
		this.email = email;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getFax() {
		return fax;
	}

	public void setFax(String fax) {
		this.fax = fax;
	}

	public String getBlog() {
		return blog;
	}

	public void setBlog(String blog) {
		this.blog = blog;
	}

	public Long getExtId() {
		return extId;
	}

	public void setExtId(Long extId) {
		this.extId = extId;
	}
}



(3)配置UserExt.hbm.xml

 
 <?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.onetoone.way2">
    <class name="UserExt" table="tbl_user_ext">
    	<id name="extId" column="extId" type="java.lang.Long">
            <generator class="native"/>
        </id>
    	
        <property name="mobile" column="mobile" type="java.lang.String" />
        <property name="telephone" column="telephone" type="java.lang.String" />
        <property name="email" column="email" type="java.lang.String" />
        <property name="address" column="address" type="java.lang.String" />
        <property name="fax" column="fax" type="java.lang.String" />
        <property name="blog" column="blog" type="java.lang.String" />
        
        <many-to-one name="user"
        	class="User"
        	column="loginName"
        	unique="true" />
    </class>
</hibernate-mapping>



(4)编写User.java

      
    package amigo.hibernate.configure.onetoone.way2;

import java.io.Serializable;

/**
 * 用户信息的POJO类.
 */
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	
    /** 用户名,主键. */
    private java.lang.String loginname;

    /** 帐户姓名. */
    private java.lang.String name;

    /** 登录密码. */
    private java.lang.String password;

    /** 创建时间. */
    private java.util.Date createtime;
    
    /** 与用户附加信息存在一对的关联关系. */
    private UserExt userExt;

	public java.lang.String getLoginname() {
		return loginname;
	}

	public void setLoginname(java.lang.String loginname) {
		this.loginname = loginname;
	}

	public java.lang.String getName() {
		return name;
	}

	public void setName(java.lang.String name) {
		this.name = name;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}

	public UserExt getUserExt() {
		return userExt;
	}

	public void setUserExt(UserExt userExt) {
		this.userExt = userExt;
	}
}



(5)配置User.hbm.xml

<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.onetoone.way2">
    <class name="User" table="tbl_user">
        <id name="loginname" column="loginName" type="java.lang.String">
            <generator class="assigned"/>
        </id>
        <property name="name" column="name" type="java.lang.String"  not-null="true" />
        <property name="password" column="password" type="java.lang.String"  not-null="true" />
        <property name="createtime" column="createTime" type="java.util.Date"  not-null="true" />
        
        <one-to-one name="userExt"
        	class="UserExt"
        	property-ref="user" 
        	cascade="all"/> 
    </class>
</hibernate-mapping>



备注:one-to-one元素的property-ref指定为user,表明tb1_user_ext表引用了tb1_user的主键作为它的处键。Cascade属必设置为all,表示在保存、更新或删除User对象时,级联保存、更新或删除UserExt对象
  

五. 配置多对多关联

        在关联数据库设计时,多对多关联是一种很常见的表与表之间的关系,而这种关系常被分解为两个一对多的关联,使用一个关联表在这两个表之间“搭桥”   

1. 多对多关联属性介绍

 class:该对象指多对多关联的另一方的对象的类。
 column:该对象多对多关联的另一方的表的对应字段  

2. 数据库脚本scripts-many-to-many.sql

      
CREATE DATABASE `testhiberante`;
USE `testhiberante`;

#创建用户信息表
CREATE TABLE `tbl_user` (
  `loginName` varchar(50) NOT NULL COMMENT '用户登录名',
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `password` varchar(50) NOT NULL COMMENT '登录密码',
  `createTime` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY  (`loginName`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='用户信息表';

#创建角色信息表
CREATE TABLE `tbl_role` (
  `roleId` bigint(20) NOT NULL auto_increment COMMENT '角色ID(自增)',
  `roleName` varchar(50) unique NOT NULL COMMENT '角色名称',
  `description` varchar(100) default NULL COMMENT '描述'
  PRIMARY KEY  (`roleId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='角色信息表';

#创建用户与角色关联表
CREATE TABLE `tbl_user_role` (
	`loginName` varchar(50) NOT NULL COMMENT '用户登录名',
  `roleId` bigint(20) NOT NULL COMMENT '角色ID'
  PRIMARY KEY  (`loginName`, `roleId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COMMENT='用户与角色关联表';

#将关联表的loginName与用户信息表的主键loginName建立外键关联
ALTER TABLE `tbl_user_role`
ADD FOREIGN KEY (`loginName`) REFERENCES `tbl_user` (`loginName`);

#将关联表的loginName与用户信息表的主键loginName建立外键关联
ALTER TABLE `tbl_user_role`
ADD FOREIGN KEY (`roleId`) REFERENCES `tbl_role` (`roleId`);



3. 配置单向多对多关系

(1) 编写User.java

          
  package amigo.hibernate.configure.manytomany.unilateralism;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 用户信息的POJO类.
 */
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	
    /** 用户名,主键. */
    private java.lang.String loginname;

    /** 帐户姓名. */
    private java.lang.String name;

    /** 登录密码. */
    private java.lang.String password;

    /** 创建时间. */
    private java.util.Date createtime;
    
    /** 角色集合. */
    private Set<Role> roles = new HashSet<Role>();

	public java.lang.String getLoginname() {
		return loginname;
	}

	public void setLoginname(java.lang.String loginname) {
		this.loginname = loginname;
	}

	public java.lang.String getName() {
		return name;
	}

	public void setName(java.lang.String name) {
		this.name = name;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
}


(2) 配置User.hbm.xml

    
  <?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.manytomany.unilateralism">
    <class name="User" table="tbl_user">
        <id name="loginname" column="loginName" type="java.lang.String">
            <generator class="assigned"/>
        </id>
        <property name="name" column="name" type="java.lang.String"  not-null="true" />
        <property name="password" column="password" type="java.lang.String"  not-null="true" />
        <property name="createtime" column="createTime" type="java.util.Date"  not-null="true" />
        
        <set name="roles" table="tbl_user_role"
        	lazy="true"
        	cascade="save-update">
			<key>
				<column name="loginname" not-null="true"/>
			</key>
			<many-to-many class="Role" column="roleid"/>
		</set>
    </class>
</hibernate-mapping>


    (3)编写Role.java

   
package amigo.hibernate.configure.manytomany.unilateralism;

import java.io.Serializable;

/**
 * 角色信息的POJO类.
 */
public class Role implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/** 角色id(自增). */
	private java.lang.Long roleId;
	
	/** 角色名称. */
	private String roleName;
	
	/** 角色描述. */
	private String description;

	public java.lang.Long getRoleId() {
		return roleId;
	}

	public void setRoleId(java.lang.Long roleId) {
		this.roleId = roleId;
	}

	public String getRoleName() {
		return roleName;
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
}



(4)配置Role.hbm.xml

  <?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.manytomany.unilateralism">
    <class name="Role" table="tbl_role">
        <id name="roleId" column="roleId" type="java.lang.Long">
            <generator class="native"/>
        </id>
        
        <property name="roleName" column="roleName" type="java.lang.String" not-null="true" />
        <property name="description" column="description" type="java.lang.String" />
    </class>
</hibernate-mapping>



4. 配置双向多对多关联

(1) 编写User.java

        
  package amigo.hibernate.configure.manytomany.bidirectional;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 用户信息的POJO类.
 */
public class User implements Serializable {
	private static final long serialVersionUID = 1L;
	
    /** 用户名,主键. */
    private java.lang.String loginname;

    /** 帐户姓名. */
    private java.lang.String name;

    /** 登录密码. */
    private java.lang.String password;

    /** 创建时间. */
    private java.util.Date createtime;
    
    /** 角色集合. */
    private Set<Role> roles = new HashSet<Role>();

	public java.lang.String getLoginname() {
		return loginname;
	}

	public void setLoginname(java.lang.String loginname) {
		this.loginname = loginname;
	}

	public java.lang.String getName() {
		return name;
	}

	public void setName(java.lang.String name) {
		this.name = name;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.util.Date getCreatetime() {
		return createtime;
	}

	public void setCreatetime(java.util.Date createtime) {
		this.createtime = createtime;
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
}



(2)配置User.hbm.xml

   
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.manytomany.bidirectional">
    <class name="User" table="tbl_user">
        <id name="loginname" column="loginName" type="java.lang.String">
            <generator class="assigned"/>
        </id>
        <property name="name" column="name" type="java.lang.String"  not-null="true" />
        <property name="password" column="password" type="java.lang.String"  not-null="true" />
        <property name="createtime" column="createTime" type="java.util.Date"  not-null="true" />
        
        <set name="roles" table="tbl_user_role"
        	lazy="true"
        	cascade="save-update">
			<key>
				<column name="loginname" not-null="true"/>
			</key>
			<many-to-many class="Role" column="roleid"/>
		</set>
    </class>
</hibernate-mapping>



(3)编写Role.java

 
 package amigo.hibernate.configure.manytomany.bidirectional;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 角色信息的POJO类.
 */
public class Role implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/** 角色id(自增). */
	private java.lang.Long roleId;
	
	/** 角色名称. */
	private String roleName;
	
	/** 角色描述. */
	private String description;

	/** 用户集合. */
    private Set<User> users = new HashSet<User>();
    
    public Set<User> getUsers() {
		return users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}
    
	public java.lang.Long getRoleId() {
		return roleId;
	}

	public void setRoleId(java.lang.Long roleId) {
		this.roleId = roleId;
	}

	public String getRoleName() {
		return roleName;
	}

	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
}



(4)配置Role.hbm.xml

   
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="amigo.hibernate.configure.manytomany.bidirectional">
    <class name="Role" table="tbl_role">
        <id name="roleId" column="roleId" type="java.lang.Long">
            <generator class="native"/>
        </id>
        
        <property name="roleName" column="roleName" type="java.lang.String" not-null="true" />
        <property name="description" column="description" type="java.lang.String" />
        <set name="users" table="tbl_user_role"
        	lazy="true"
        	inverse="true"
        	cascade="save-update">
			<key>
				<column name="roleId" not-null="true"/>
			</key>
			<many-to-many class="User" column="loginname"/>
		</set>
    </class>
</hibernate-mapping>

本章完结,主要是展示了Hibernate的各配置文件的配置


      
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics