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

目录
相关文章
|
人工智能 文字识别 监控
将人工智能融入多媒体 助力视频产业加速——阿里云视频AI全能力解读
结合人工智能视频理解流程和用户的需求场景,我们将视频AI的功能分成四个大部分,视频智能审核、视频内容理解、视频智能编辑、视频版权保护。其中视频审核功能包括视频鉴黄、暴恐涉政识别、广告二维码识别、无意义直播识别等,利用识别能力将网络上没营养和不健康的视频内容进行排查和处理;视频理解功能包括视频分类、标签,人物识别、语音识别,同时也包括对视频中的文字进行识别(OCR);视频编辑层面可以实现视频首图、视频摘要、视频highlight的生成,同时支持新闻拆条;关于视频版权,支持视频相似性、同源视频检索和音视频指纹等功能。
17615 0
将人工智能融入多媒体 助力视频产业加速——阿里云视频AI全能力解读
|
11月前
|
Web App开发 数据采集 移动开发
HTML5新增的属性和标签
HTML5新增的属性和标签
356 0
|
Linux 开发工具 图形学
Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案
自2018年起,我们成功实现了Unity环境下的低延迟RTSP|RTMP播放,达到毫秒级延迟,获得业界广泛认可。现已覆盖Windows、Android、iOS与Linux平台的RTMP推送、轻量级RTSP服务及RTSP|RTMP播放。通过高效采集Unity窗口或摄像头数据,并利用原生SDK进行编码与推送,确保了数据传输的高速性。此外,播放器支持多路视频同时播放,适应不同分辨率,并保持长时间运行稳定。更多技术细节和技术博文,请参考相关链接。
584 1
|
存储 安全 Cloud Native
阿里云支持米哈游新游《绝区零》全球开服!
阿里云支持米哈游新游《绝区零》全球开服!
1036 3
|
存储 网络性能优化 芯片
芯片引脚字母代表的意义
芯片引脚字母代表的意义---常用
6267 0
|
SQL HIVE 消息中间件
日志采集框架Flume、Flume介绍、概述、运行机制、Flume采集系统结构图(1、简单结构、复杂结构)
1. 日志采集框架Flume 1.1 Flume介绍 1.1.1 概述 1.Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。 2.Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、hbase、hive、kafka等众多外部存储系统中 3.一般的采集需求,通过对flume的简单配置即可实现
3396 0
|
存储 分布式计算 搜索推荐
|
缓存 Ubuntu Linux
Linux buffer/cache内存占用过高
Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。
4442 0
Linux buffer/cache内存占用过高
|
搜索推荐 算法 调度
“为你推荐”背后的算法探秘
我们希望营销场景作为卡片的形式插入到现有的为你推荐里,一方面是为这些场景分发流量,一方面是希望提高整体的坑位曝光收益。今天,我们就来探秘如何插入这些营销场景卡片。
3392 0