您的位置:首页 > 其它

联合主键hibernate配置

2013-04-29 20:28 337 查看
复合(联合)主键映射

通常将复合主键相关的属性,单独放到一个类中

* 此类必须实现序列化接口 implements java.io.Serializable

* 覆写hashcode和equals方法

类:

import java.io.Serializable;

public class NamePK implementsSerializable{ //主键类

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;

}

//重写,交给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;

}

//重写,交给eclipse自己来写

public boolean equals(Object obj) {

   if (this == obj)

    returntrue;

   if (obj == null)

    returnfalse;

   if (getClass() !=obj.getClass())

    returnfalse;

   final NamePK other = (NamePK)obj;

   if (firstName == null) {

    if(other.firstName != null)

    return false;

   } else if(!firstName.equals(other.firstName))

    returnfalse;

   if (lastName == null) {

    if(other.lastName != null)

    return false;

   } else if(!lastName.equals(other.lastName))

    returnfalse;

   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"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mappingpackage="com.zd.model">

   <class name="UserInfo" table="user_info">

       <composite-idname="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 = newNamePK();
     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");

     UserInfo ui = (UserInfo)session.get(UserInfo.class, namePk); //get orload均是要序列化的类,所以要把主键implementsSerializable
     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);

   }

  

}

原文地址:http://blog.sina.com.cn/s/blog_7ea6850b0100wpsi.html#bsh-73-218438078
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: