一个简单的复合主键的做关联类的例子

用户类User,物品类Goods,每次记录用户使用物品的情况,情况包括谁在什么时间借了什么物品。其中有一个约束条件就是用户只能对同一物品使用一次。使用记录类为Record类。我们可以看出User对Record是1:n多的关系,Record对Goods是n:1的关系,而User和Goods之间没有之间的关系。

RecordId类是复合主键类,分别以n:1关联User类,n:1关联Goods类。RecordId类需要实现equals方法,需要实现Serializable。而Record类用RecordId来做主键。

类定义如下:


User.java

Java代码 复制代码
  1. /*  
  2.  * Created on 2004-10-20  
  3.  *  
  4.  */  
  5. package com.javaeye;   
  6.   
  7. import java.util.Calendar;   
  8. import java.util.HashSet;   
  9. import java.util.Set;   
  10.   
  11. /**  
  12.  * @author robbin  
  13.  *    
  14.  */  
  15. public class User {   
  16.   
  17.     private Long id;   
  18.   
  19.     private String name;   
  20.   
  21.     private Set usingRecords = new HashSet();   
  22.   
  23.     /**  
  24.      * @return Returns the id.  
  25.      */  
  26.     public Long getId() {   
  27.         return id;   
  28.     }   
  29.   
  30.     /**  
  31.      * @param id  
  32.      *            The id to set.  
  33.      */  
  34.     public void setId(Long id) {   
  35.         this.id = id;   
  36.     }   
  37.   
  38.     /**  
  39.      * @return Returns the name.  
  40.      */  
  41.     public String getName() {   
  42.         return name;   
  43.     }   
  44.   
  45.     /**  
  46.      * @param name  
  47.      *            The name to set.  
  48.      */  
  49.     public void setName(String name) {   
  50.         this.name = name;   
  51.     }   
  52.   
  53.     /**  
  54.      * @return Returns the usingRecords.  
  55.      */  
  56.     public Set getUsingRecords() {   
  57.         return usingRecords;   
  58.     }   
  59.   
  60.     /**  
  61.      * @param usingRecords  
  62.      *            The usingRecords to set.  
  63.      */  
  64.     public void setUsingRecords(Set usingRecords) {   
  65.         this.usingRecords = usingRecords;   
  66.     }   
  67.   
  68.     public void useGoods(Goods goods) {   
  69.         RecordId id = new RecordId();   
  70.         id.setUser(this);   
  71.         id.setGoods(goods);   
  72.         Record record = new Record();   
  73.         record.setRecordId(id);   
  74.         record.setRecordTime(Calendar.getInstance());   
  75.         usingRecords.add(record);   
  76.     }   
  77.   
  78.     public void removeRecord(Record record) {   
  79.         usingRecords.remove(record);   
  80.     }   
  81. }  

Good.java

Java代码 复制代码
  1.   
  2. /*  
  3.  * Created on 2004-10-20  
  4.  *  
  5.  */  
  6. package com.javaeye;   
  7.   
  8. import java.util.HashSet;   
  9. import java.util.Set;   
  10.   
  11. /**  
  12.  * @author robbin  
  13.  *    
  14.  */  
  15. public class Goods {   
  16.   
  17.     private Long id;   
  18.   
  19.     private String name;   
  20.   
  21.     private Set usedRecords = new HashSet();   
  22.   
  23.     /**  
  24.      * @return Returns the id.  
  25.      */  
  26.     public Long getId() {   
  27.         return id;   
  28.     }   
  29.   
  30.     /**  
  31.      * @param id  
  32.      *            The id to set.  
  33.      */  
  34.     public void setId(Long id) {   
  35.         this.id = id;   
  36.     }   
  37.   
  38.     /**  
  39.      * @return Returns the name.  
  40.      */  
  41.     public String getName() {   
  42.         return name;   
  43.     }   
  44.   
  45.     /**  
  46.      * @param name  
  47.      *            The name to set.  
  48.      */  
  49.     public void setName(String name) {   
  50.         this.name = name;   
  51.     }   
  52.   
  53.     /**  
  54.      * @return Returns the usedRecords.  
  55.      */  
  56.     public Set getUsedRecords() {   
  57.         return usedRecords;   
  58.     }   
  59.   
  60.     /**  
  61.      * @param usedRecords  
  62.      *            The usedRecords to set.  
  63.      */  
  64.     public void setUsedRecords(Set usedRecords) {   
  65.         this.usedRecords = usedRecords;   
  66.     }   
  67.   
  68. }  


RecordId .java

Java代码 复制代码
  1. /*  
  2.  * Created on 2004-10-20  
  3.  *  
  4.  */  
  5. package com.javaeye;   
  6.   
  7. import java.io.Serializable;   
  8.   
  9. /**  
  10.  * @author robbin  
  11.  *    
  12.  */  
  13. public class RecordId implements Serializable {   
  14.   
  15.     private User user;   
  16.   
  17.     private Goods goods;   
  18.   
  19.     /**  
  20.      * @return Returns the goods.  
  21.      */  
  22.     public Goods getGoods() {   
  23.         return goods;   
  24.     }   
  25.   
  26.     /**  
  27.      * @param goods  
  28.      *            The goods to set.  
  29.      */  
  30.     public void setGoods(Goods goods) {   
  31.         this.goods = goods;   
  32.     }   
  33.   
  34.     /**  
  35.      * @return Returns the user.  
  36.      */  
  37.     public User getUser() {   
  38.         return user;   
  39.     }   
  40.   
  41.     /**  
  42.      * @param user  
  43.      *            The user to set.  
  44.      */  
  45.     public void setUser(User user) {   
  46.         this.user = user;   
  47.     }   
  48.   
  49.     public boolean equals(Object obj) {   
  50.         return (obj instanceof RecordId)   
  51.                 && (this.getUser().equals(((RecordId) obj).getUser()))   
  52.                 && (this.getGoods().equals(((RecordId) obj).getGoods()));   
  53.     }   
  54.   
  55.     public int hashCode() {   
  56.         return this.getUser().hashCode() ^ this.getGoods().hashCode();   
  57.     }   
  58. }  

Record .java

Java代码 复制代码
  1. /*  
  2.  * Created on 2004-10-20  
  3.  *  
  4.  */  
  5. package com.javaeye;   
  6.   
  7. import java.util.Calendar;   
  8.   
  9. /**  
  10.  * @author robbin  
  11.  *    
  12.  */  
  13. public class Record {   
  14.   
  15.     private RecordId recordId;   
  16.   
  17.     private Calendar recordTime;   
  18.   
  19.     /**  
  20.      * @return Returns the recordId.  
  21.      */  
  22.     public RecordId getRecordId() {   
  23.         return recordId;   
  24.     }   
  25.   
  26.     /**  
  27.      * @param recordId  
  28.      *            The recordId to set.  
  29.      */  
  30.     public void setRecordId(RecordId recordId) {   
  31.         this.recordId = recordId;   
  32.     }   
  33.   
  34.     /**  
  35.      * @return Returns the recordTime.  
  36.      */  
  37.     public Calendar getRecordTime() {   
  38.         return recordTime;   
  39.     }   
  40.   
  41.     /**  
  42.      * @param recordTime  
  43.      *            The recordTime to set.  
  44.      */  
  45.     public void setRecordTime(Calendar recordTime) {   
  46.         this.recordTime = recordTime;   
  47.     }   
  48. }  

射文件配置如下:

Xml代码 复制代码
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 2.0//EN"   
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 
  5.   
  6. <hibernate-mapping>
  7.    <class name="com.javaeye.User">  
  8.        <id name="id" unsaved-value="null"> 
  9.             <generator class="native"/>   
  10.         </id>   
  11.            
  12.         <property name="name"/>   
  13.            
  14.        <set name="usingRecords" inverse="true" lazy="true" cascade="all-delete-orphan">  
  15.            <key column="user_id" />   
  16.            <one-to-many class="com.javaeye.Record"/>   
  17.         </set>   
  18.     </class>  
  19.        
  20. </hibernate-mapping> 




 

Xml代码 复制代码
  1. <?xml version="1.0"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 2.0//EN"   
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  
  5.   
  6. <hibernate-mapping> 
  7.     <class name="com.javaeye.Goods"> 
  8.         <id name="id" unsaved-value="null">
  9.             <generator class="native"/>   
  10.         </id>
  11.            
  12.          <property name="name"/>
  13.            
  14.         <set name="usedRecords" inverse="false" lazy="true" cascade="all-delete-orphan">
  15.             <key column="goods_id" />
  16.             <one-to-many class="com.javaeye.Record"/>
  17.         </set>   
  18.     </class>  
  19.        
  20. </hibernate-mapping>



 

Xml代码 复制代码
  1. <?xml version="1.0"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 2.0//EN"   
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">   
  5.   
  6. <hibernate-mapping>  
  7.    <class name="com.javaeye.Record">  
  8.         <composite-id name="recordId" class="com.javaeye.RecordId" unsaved-value="any" >   
  9.           <key-many-to-one name="user" column="user_id" class="com.javaeye.User" />  
  10.            <key-many-to-one name="goods" column="goods_id" class="com.javaeye.Goods" />   
  11.        <composite-id>   
  12.            
  13.        <property name="recordTime" type="calendar"/>   
  14.   
  15.    </class>   
  16.        
  17. <hibernate-mapping>  
  18. 记录物品使用情况的代码书写如下:

    Java代码 复制代码
    1. Goods goods = new Goods();   
    2. goods.setName("book");   
    3. s.save(goods);   
    4. User user = new User();   
    5. user.setName("robbin");   
    6. s.save(user);   
    7.   
    8. // 用户使用物品   
    9. user.useGoods(goods);  


    当用户重复使用物品的时候,调用userGoods方法,Hibernate会抛出主键重复的错误。

    判断用户是否使用某物品的办法如下:

    Java代码 复制代码
    1. RecordId id = new RecordId();   
    2. id.setUser(user);   
    3. id.setGoods(goods);   
    4.   
    5. Record record = (Record) session.get(Record.class, id);   
    6.   
    7. if (record == null) {   
    8.     user.usGoods(goods);   
    9. else {   
    10.     throw new UsedGoodsException("...");   
    11. }  


    然而需要指出的是,Gavin King并不提倡使用composite-id,如果你不是基于已有的数据库编程,而是重新设计数据库结构,那么建议使用UserType。你可以自定义一个UserType,包括User和Goods,并且在hbm中定义该UserType为unique的,同样可以达到目的。而这种方式的好处则是不需要你来手工维护id,而由Hibernate自动维护。UserType的使用方法参考手册5.2.4节和Hibernate自带的示例中的net.sf.hibernate.test.DoubleStringType。

 

你可能感兴趣的:(Hibernate,String,user,null,Class,generator)