昨天在回复中我写了一个别人给我的解决方案。这种方法简单,但是在数据库的结构上不时很好。
我自己也找了一个方法,但是比较麻烦。
从数据库底层做起,原来我的数据库设计有问题。
我在用PowerDesigner建立概念模型的时候有一定问题。对于Friend表我用的是Entity,其实这个关系不应该是Entity,而应该是Association。如下图:
userfriend.jpg

这样在生成物理数据模型时就会把 host,friend一起作为PK,如果用Entity就只能是FK

这样的结构如果你用工具生成映射文件和Java文件时就会多出一个FriendID的类,里面有两个元素就是host和friend
Friend.hbm.xml的结构如下
<hibernate-mapping>
    
<!-- 
    Auto-generated mapping file from
    the hibernate.org cfg2hbm engine
-->
    
<class name="org.netcatcher.web.model.Friends" table="Friends" schema="nc" catalog="NetCatcher">
        
<composite-id name="id" class="org.netcatcher.web.model.FriendsId">
            
<key-many-to-one name="Host" class="org.netcatcher.web.model.Customers">
                
<column name="host" length="100" not-null="false"/>
            
</key-many-to-one>
            
<key-many-to-one name="Friend" class="org.netcatcher.web.model.Customers">
                
<column name="friend" length="100" not-null="false"/>
            
</key-many-to-one>
        
</composite-id>
    
</class>
</hibernate-mapping>
FriendID.java如下
public class FriendsId  implements java.io.Serializable {

    
/**
     * 
     
*/

    
private static final long serialVersionUID = 3689069555917795889L;
    
// Fields    

    
private org.netcatcher.web.model.Customers Host;
    
private org.netcatcher.web.model.Customers Friend;


    
// Constructors

    
/** default constructor */
    
public FriendsId() {
    }

    
// Property accessors
    /**
     
*/

   
public org.netcatcher.web.model.Customers getHost () {
        
return this.Host;
    }

    
   
public void setHost(org.netcatcher.web.model.Customers Host) {
        
this.Host = Host;
    }

    
/**
     
*/

   
public org.netcatcher.web.model.Customers getFriend () {
        
return this.Friend;
    }

    
   
public void setFriend (org.netcatcher.web.model.Customers Friend) {
        
this.Friend = Friend;
    }


   
public boolean equals(Object other) {
         
if ( (this == other ) ) return true;
         
if ( (other == null ) ) return false;
         
if ( !(other instanceof FriendsId) ) return false;
         FriendsId castOther 
= ( FriendsId ) other; 
         
         
return (this.getHost()==castOther.getHost()) || (this.getHost()==null ? false : (castOther.getHost()==null ? false : this.getHost().equals(castOther.getHost())))
 
&& (this.getFriend()==castOther.getFriend()) || (this.getFriend()==null ? false : (castOther.getFriend()==null ? false : this.getFriend().equals(castOther.getFriend())));
   }

   
   
public int hashCode() {
         
int result = 17;
         
         result 
= 37 * result + this.getHost().hashCode();
         result 
= 37 * result + this.getFriend().hashCode();
         
return result;
   }
   
}

Friends.java如下:
public class Friends  implements java.io.Serializable {

    
// Fields    

    
/**
     * 
     
*/

    
private static final long serialVersionUID = 3258409517246395959L;
    
private org.netcatcher.web.model.FriendsId id;


    
// Constructors

    
/** default constructor */
    
public Friends() {
    }

    
    
/** constructor with id */
    
public Friends(org.netcatcher.web.model.FriendsId id) {
        
this.id = id;
    }
    

    
// Property accessors
    /**
     
*/

   
public org.netcatcher.web.model.FriendsId getId () {
        
return this.id;
    }

    
   
public void setId (org.netcatcher.web.model.FriendsId id) {
        
this.id = id;
    }

}

这样你在添加好友列表时要这样:

public void addFriend(String hostEmail,String friendEmail) 
        throws InfrastructureException
{
        
try {
            HibernateUtil.beginTransaction();
            Customers host 
= (Customers)HibernateUtil.getSession()
                                .load(Customers.
class,hostEmail);
            Customers friend 
= (Customers)HibernateUtil.getSession()
                                .load(Customers.
class,friendEmail);
            
            FriendsId fid 
= new FriendsId();
            fid.setHost(host);
            fid.setFriend(friend);            
            Friends f 
= new Friends(fid);
            HibernateUtil.getSession().saveOrUpdate(f);
            HibernateUtil.commitTransaction();
        }
 catch (HibernateException e) {
            
throw new InfrastructureException(e);
        }
 
    }

注意不能 Host.getFriends().add(f);
因为f并不知道是谁加了它!