复合(联合)主键映射的时候,通常将复合主键相关的属性,单独放到一个类中,那么需要满足以下条件
①此类必须实现序列化接口 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
分享到:
相关推荐
hibernate中用到联合主键的看看就会了很棒的资料
Hibernate联合主键,MyEclipse的例子
hibernate的联合主键怎么设置、hibernate的联合主键怎么设置.doc
主要介绍了java hibernate使用注解来定义联合主键的相关资料,需要的朋友可以参考下
联合主键用Hibernate注解映射方式主要有三种: 第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键...
hibernate复合主键的实例,hibernate复合主键的实例。
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
NULL 博文链接:https://liuna718-163-com.iteye.com/blog/748089
请更名为 Hibernate复合主键.part2.rar
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
NULL 博文链接:https://cdxs2.iteye.com/blog/1932507
Hibernate 系列教程 单向一对多
Hibernate实体关系映射
第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,Hibernate多表联合查询, ...
ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,Hibernate多表联合查询, ...
复合(联合)主键映射(hibernate_composite) 27 集合(collection)映像 (hibernate_collection) 28 Hibernate 对数据库的并发支持 30 悲观锁(hibernate_pessimistic) 30 乐观锁(hibernate_optimistic) 32 HQL...
Hibernate关联关系配置,一对一,一对多,多对多,联合主键等的配置
依赖对象(Dependent objects) 组件(Component)是一个被包含的...比如,OrderLine类具有一个主键,这个主键依赖于Order的(联合)主键。 insert="false" update="false"> .... </class>
ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,Hibernate多表联合查询, ...