hibernate详解(三)----->>组件映射(二)之复合主键

   3、组件类作为持久化类的对象标识符属性

     这种情况主要是针对已经数据库表建模时,由于数据库表中采用联合自然主键(复合自然主键),为了完成这种映射需求,Hibernate使用组件类把它映射成持久化类的对象标识符。

     Hibernate要求,作为复合对象标识符类的UserOid类必须实现Java.io.Serializable,且要用作为复合标识符的属性重写hashCode()方法和equlas()方法。

    User.java

Java代码 复制代码  收藏代码
  1. package com.zxf.domain;   
  2.   
  3.   
  4. /** 用户持久化类(实体类) */  
  5. public class User {   
  6.     private UserOid id;                 //对象标识符(OID)   
  7.     private String description;      //描述   
  8.       
  9.     public User(){}                 //无参数的构造方法   
  10.       
  11.     //以下省略所有属性的getters和setters方法...   
  12.   
  13. }  
package com.zxf.domain;


/** 用户持久化类(实体类) */
public class User {
    private UserOid id;                 //对象标识符(OID)
    private String description;      //描述
   
    public User(){}                 //无参数的构造方法
   
    //以下省略所有属性的getters和setters方法...

}

   UserOid .java

Java代码 复制代码  收藏代码
  1. package com.zxf.domain;   
  2.   
  3.   
  4. /** 用户类的对象标识符类  
  5.  *  必须实现Serializable和重写hashCode()和equals()方法  
  6.  */  
  7. public class UserOid implements java.io.Serializable {   
  8.     private static final long serialVersionUID = -9079299317576122433L;   
  9.     private String firstName;     //名   
  10.     private String lastName;      //姓   
  11.        
  12.     public UserOid(){}            //无参数的构造方法   
  13.   
  14.     //用fristName、lastName重写hashCode方法   
  15.     public int hashCode() {   
  16.         final int prime = 31;   
  17.         int result = 1;   
  18.         result = prime * result + ((firstName == null) ? 0 :    
  19.   
  20. firstName.hashCode());   
  21.         result = prime * result + ((lastName == null) ? 0 :    
  22.   
  23. lastName.hashCode());   
  24.         return result;   
  25.     }   
  26.   
  27.     //用fristName、lastName重写equals方法   
  28.     public boolean equals(Object obj) {   
  29.         if (this == obj)    return true;   
  30.         if (obj == null)    return false;   
  31.         if (getClass() != obj.getClass())   return false;   
  32.         UserOid other = (UserOid) obj;   
  33.         if (firstName == null) {   
  34.             if (other.firstName != null)    return false;   
  35.         } else if (!firstName.equals(other.firstName))      return false;   
  36.         if (lastName == null) {   
  37.             if (other.lastName != null)     return false;   
  38.         } else if (!lastName.equals(other.lastName))    return false;   
  39.         return true;   
  40.     }   
  41.   
  42.     //以下省略所有属性的getters和setters方法...   
  43. }  
package com.zxf.domain;


/** 用户类的对象标识符类
 *  必须实现Serializable和重写hashCode()和equals()方法
 */
public class UserOid implements java.io.Serializable {
	private static final long serialVersionUID = -9079299317576122433L;
	private String firstName;     //名
	private String lastName;      //姓
	
	public UserOid(){}            //无参数的构造方法

	//用fristName、lastName重写hashCode方法
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result	+ ((firstName == null) ? 0 : 

firstName.hashCode());
		result = prime * result	+ ((lastName == null) ? 0 : 

lastName.hashCode());
		return result;
	}

	//用fristName、lastName重写equals方法
	public boolean equals(Object obj) {
		if (this == obj)	return true;
		if (obj == null)	return false;
		if (getClass() != obj.getClass())	return false;
		UserOid other = (UserOid) obj;
		if (firstName == null) {
			if (other.firstName != null)	return false;
		} else if (!firstName.equals(other.firstName))		return false;
		if (lastName == null) {
			if (other.lastName != null)		return false;
		} else if (!lastName.equals(other.lastName))	return false;
		return true;
	}

	//以下省略所有属性的getters和setters方法...
}

  User.hbm.xml

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.   <!-- 映射持久化类 -->  
  8.     <class name="com.zxf.domain.User" table="user">  
  9.         <!--    
  10.           composite-id元素映射复合对象标识符   
  11.           name属性:指定属性名   
  12.           class属性:指定对应的此属性的类类型   
  13.          -->  
  14.         <composite-id name="id" class="com.zxf.domain.UserOid">  
  15.             <!-- key-property元素映射组件类的的每个属性 -->  
  16.             <key-property name="firstName" column="first_name"/>  
  17.             <key-property name="lastName" column="last_name"/>  
  18.         </composite-id>  
  19.         <!-- 用property映射每个普通属性 -->  
  20.         <property name="description"/>           
  21.     </class>  
  22. </hibernate-mapping>  
<?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>
  <!-- 映射持久化类 -->
	<class name="com.zxf.domain.User" table="user">
		<!-- 
		  composite-id元素映射复合对象标识符
		  name属性:指定属性名
		  class属性:指定对应的此属性的类类型
		 -->
		<composite-id name="id" class="com.zxf.domain.UserOid">
			<!-- key-property元素映射组件类的的每个属性 -->
			<key-property name="firstName" column="first_name"/>
			<key-property name="lastName" column="last_name"/>
		</composite-id>
		<!-- 用property映射每个普通属性 -->
		<property name="description"/>		
	</class>
</hibernate-mapping>

   hibernate.cfg.xml

Xml代码 复制代码  收藏代码
  1. <!DOCTYPE hibernate-configuration PUBLIC   
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.            
  8.         <!-- 数据库方言设置 -->  
  9.         <property name="hibernate.dialect">  
  10.             org.hibernate.dialect.MySQLInnoDBDialect   
  11.         </property>  
  12.            
  13.         <!-- 数据库连接参数设置 -->  
  14.         <property name="hibernate.connection.driver_class">  
  15.             com.mysql.jdbc.Driver   
  16.         </property>  
  17.         <property    
  18.   
  19. name="hibernate.connection.url">jdbc:mysql:///hibernate</property>  
  20.         <property name="hibernate.connection.username">root</property>  
  21.         <property name="hibernate.connection.password">123</property>  
  22.        
  23.         <!--实际操作数据库时是否显示SQL -->  
  24.         <!--   
  25.         <property name="hibernate.show_sql">true</property>-->  
  26.         <property name="hibernate.format_sql">true</property>  
  27.            
  28.            
  29.         <!--将数据库schema的DDL导出到数据库 -->  
  30.         <property name="hibernate.hbm2ddl.auto">update</property>  
  31.   
  32.         <!-- 以下定义实体类与数据库表的映像文件 -->  
  33.         <mapping resource="com/zxf/domain/User.hbm.xml" />  
  34.     </session-factory>  
  35. </hibernate-configuration>  

猜你喜欢

转载自svsesunyuan.iteye.com/blog/1026045