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

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

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

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

    User.java

package com.zxf.domain;   
  
  

/** 用户持久化类(实体类) */   

public class User {    

    private UserOid id;                 //对象标识符(OID)    

    private String description;      //描述    
      

    public User(){}                 //无参数的构造方法    
      

    //以下省略所有属性的getters和setters方法...    
  
}  
package com.zxf.domain;


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

}

   UserOid .java

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方法...    
}  
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代码 hibernate详解(三)----->>组件映射(二)之复合主键 hibernate详解(三)----->>组件映射(二)之复合主键hibernate详解(三)----->>组件映射(二)之复合主键
  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代码 hibernate详解(三)----->>组件映射(二)之复合主键 hibernate详解(三)----->>组件映射(二)之复合主键hibernate详解(三)----->>组件映射(二)之复合主键
  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>  

相关推荐