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;
}

//重写,交给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)
     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"
"http://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");
       UserInfo ui = (UserInfo) session.get(UserInfo.class, namePk); //get or load均是要序列化的类,所以要把主键implements Serializable
       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);
    }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值