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"
"
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");

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

 

 

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

目录
相关文章
|
1月前
|
Oracle Java 关系型数据库
JPA主键生成策略介绍
【1月更文挑战第9天】本篇 Huazie 向大家介绍 JPA主键生成策略
94 5
JPA主键生成策略介绍
|
前端开发 Java 数据库连接
Mybatis获取自增长的主键id
Mybatis获取自增长的主键id
Mybatis获取自增长的主键id
|
存储 SQL Oracle
Hibernate-05-主键生成策略
Hibernate-05-主键生成策略
Hibernate-05-主键生成策略
|
Java 数据库连接
Hibernate的自身关联映射(十)
Hibernate的自身关联映射(十)
159 0
Hibernate的自身关联映射(十)
|
Java 关系型数据库 程序员
Hibernate-ORM:13.Hibernate中的连接查询
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     本篇博客将会解释Hibernate中的连接查询(各种join) 一,目录   1.
915 0
|
Java 关系型数据库 数据库连接
Hibernate-ORM:11.Hibernate中的关联查询
      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客将讲述Hibernate中的关联查询,及其级联(cascade)操作,以及指定哪一方维护关联关系的(inverse)   一,讲述目录如下:   1.
1204 0
|
Oracle 关系型数据库 Java
Hibernate主键生成策略及选择
1 .increment:适用于short,int,long作为主键,不是使用数据库自动增长机制 这是hibernate中提供的一种增长机制            在程序运行时,先进行查询:select max(id) from user;                              ...
748 0
|
Java 关系型数据库 数据库连接
|
Web App开发 Java 数据库连接