閱讀867 返回首頁    go 魔獸


Hibernate聯合主鍵

 

複合(聯合)主鍵映射的時候,通常將複合主鍵相關的屬性,單獨放到一個類中,那麼需要滿足以下條件

①此類必須實現序列化接口 implements java.io.Serializable

②覆寫hashcode和equals方法

 

類:

import java.io.Serializable;

// 主鍵類

public class NamePK implements Serializable{

private static final long serialVersionUID = 8313037022835155821L;

private String firstName;
private String lastName;

public String getFirstName() {
   return firstName;
}
public void setFirstName(String firstName) {
   this.firstName = firstName;
}
public String getLastName() {
   return lastName;
}
public void setLastName(String lastName) {
   this.lastName = lastName;
}

// hashcode和equals方法交給交給eclipse自己來寫,source/generator hashCode() and equals()
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;
}

 

public boolean equals(Object obj) {
   if (this == obj)
    return true;
   if (obj == null)
    return false;
   if (getClass() != obj.getClass())
    return false;
   final NamePK other = (NamePK) 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;
}

}

 

// 實體類

public class UserInfo {
private NamePK namePk;
private String sex;
private int age;

}

 

 

hbm.xml

UserInfo.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"
https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zd.model">
    <class name="UserInfo" table="user_info" >
        <composite-id name="namePk">
            <key-property name="firstName" column="first_name" length="12"/>
            <key-property name="lastName" column="last_name" length="12"/>
        </composite-id>
        <property name="sex" length="12"/>
        <property name="age" />
    </class>

</hibernate-mapping>

 

 

測試用例:

public void testCompositeId(){
   Session session = null;
   Transaction ta = null;
   try{
      session = HibernateUtil.getSession();
      ta = session.beginTransaction();
    
  NamePK namePk = new NamePK();
      namePk.setFirstName("Zhang");
      namePk.setLastName("san");
      UserInfo ui = new UserInfo();
      ui.setNamePk(namePk);
      ui.setSex("M");
      ui.setAge(12);
      session.save(ui);
      ta.commit();
   }catch(Exception e){
    e.printStackTrace();
    if(ta != null){
     ta.rollback();
    }
   }finally{
    //關閉session,user變為detached離線對象
    HibernateUtil.closeSession(session);
   }
 
}

 

public void testgetId(){
   Session session = null;
   Transaction ta = null;
   try{
      session = HibernateUtil.getSession();
      ta = session.beginTransaction();
      NamePK namePk = new NamePK();
      namePk.setFirstName("Zhang");
      namePk.setLastName("san");

      //get or load均是要序列化的類,所以要把主鍵implements Serializable
      UserInfo ui = (UserInfo) session.get(UserInfo.class, namePk);        

      System.out.println(ui.getAge());
      System.out.println(ui.getSex());
      ta.commit();
   }catch(Exception e){
      e.printStackTrace();
      if(ta != null){
         ta.rollback();
      }
   }finally{
     //關閉session,user變為detached離線對象
     HibernateUtil.closeSession(session);
   }
}

 

 

原帖地址:https://hi.baidu.com/fytcm/blog/item/5124737b38ea56fe0bd187fa.html

最後更新:2017-04-04 07:32:01

  上一篇:go android Universal Image Loader for Android 說明文檔 (1)
  下一篇:go java中的魔法數