Hibernate联合主键映射

《Hibernate学习笔记三》:联合主键的映射 《Hibernate学习笔记之三》:联合主键的映射就如在前面所举的例子一样,是使用的id作为唯一的主键,一般情况下我们也只使用唯一的一个属性作为主键,但是在实际中,我们可能会遇到几个属性作为主键的情况,因此,在本篇博文中,就来介绍下,联合主键的映射关系应该如何来做??联合主键的映射有两种方式来进行实现。1、使用映射文件 XXX.bhm.xml2、使用AnnotationHibernate首先需要使 阅读详情

1.联合主键的映射规则
1) 类中的每个主键属性都对应到数据表中的每个主键列。

Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法,重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象。这反映到程序领域中就是根据hashCode与equals方法来判断某两个对象是否能够放到诸如Set这样的集合当中。联合主键的实体类实现Serializable接口的原因在于使用get或load方法的时候需要先构建出来该实体的对象,并且将查询依据(联合主键)设置进去,然后作为get或load方法的第二个参数传进去即可。

2) 将主键所对应属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,重写equals方法与hashCode方法,原因与上面一样。

以Student类为例,实现上述两种映射联合主键的配置:

2.Student中的两个属性作为联合主键属性

Student类:
public class Student implements Serializable {//必须要实现Serializable接口 
    private String cardID;//cardID和name映射为联合主键
    private String name;
    private int age;
        //get、set、hashCode、equals方法省略
}

注:可使用MyEclipse中的Sourse-->Gennerate hashCode and equals来使用MyEclipse快速生成hashCode和equals方法

Student.hbm.xml配置:

<class name="bean.Student" table="student">
        <composite-id><!--联合主键,student表中的主键为(student_name,card_id)-->
           <key-property name="name" column="student_name" type="string"></key-property>           

             <!--name及cardID为Student类中的属性-->
           <key-property name="cardID" column="card_id" type="string"></key-property>
        </composite-id>
        <property name="age" column="student_age" type="int"></property>
</class>

 保存对象:

              tx=session.beginTransaction();             
              Student s1=new Student();
              s1.setName("lisi");
              s1.setAge(22);
              s1.setCardID("711");
              System.out.println(s1);
              session.save(s1);
              tx.commit();

 注意:主键为(card_id,student_id)若连续执行上述的保存语句两次,当然会抛异常,应为主键重复:  
           org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update


3.将Student类中的两个主键属性提取为一个新的类PrimaryKey,即主键类
主键类PrimaryKey:

       

  1. public class PrimaryKey implements Serializable{

  2. private String cardID;

  3. private String name;

  4. //get、set、hashCode、equals方法省略

  5. }
    Student类中含有PrimaryKey类型的属性及对应set、get方法:

  6. public class Student {

  7. private int age;

  8. private PrimaryKey primaryKey;

  9. //set、get方法省略

  10. }
    Student.hbm.xml文件中的配置:
    <class name="bean.Student" table="student">
            <composite-id name="primaryKey" class="bean.PrimaryKey"><!--PrimaryKey为我们自定义的主键类-->
                         <key-property name="name" column="student_name" type="string"></key-property>           
                        <!--name及cardID为PrimaryKey类中的属性-->
                        <key-property name="cardID" column="card_id" type="string"></key-property>
             </composite-id>
               <property name="age" column="student_age" type="int"></property>
     </class>

    保存对象:
                 tx=session.beginTransaction();             
                  Student s1=new Student();
                  s1.setAge(23);
                  PrimaryKey p=new PrimaryKey();
                  p.setCardID("102");
                  p.setName("zhangsan");
                  s1.setPrimaryKey(p);
                  session.save(s1);
                  tx.commit();

    同样,对于上述代码的重复执行也会导致主键重复抛出异常。

    查询:
                PrimaryKey p=new PrimaryKey();
                  p.setCardID("711");
                  p.setName("lisi");
                  Student s=(Student)session.get(Student.class,p);//所以PrimaryKey要实现Serializable接口
                  System.out.println(s.getAge())

     

     4.对于以上两种映射联合主键的方式,反映到数据库中的表的结构是相同的,student表的内容为:

  转载:http://blog.youkuaiyun.com/jialinqiang/article/details/8704538

java hibernate使用注解来定义联合主键 主要介绍了java hibernate使用注解来定义联合主键的相关资料,需要的朋友可以参考下 立即下载

相关推荐

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

关于hibernate产生的自增主键

Hibernate中domain配置文件 将主键改成自增长类型: Oracle设置 SQLServer 2000设置 ―――――――――例如SQLServer 2000中―――――――――――――――――― ―――――――――――――――――Oracle中―――――――――――――――――― ...

neil 673

Rocfall安装包&安装教程

Rocfall 第一步:下载安装包 下载路径: 链接:https://pan.baidu.com/s/1Dzvxzv67dSPRi7f7ZT9EeA 提取码:o9pl 第二部:安装 安装包解压 选择part1进行解压 点击Setup.exe启动安装 生成Serial Number 替换启动程序 安装完毕 素材来源于网络(禁止用于商业仅用于完成毕业设计和研究使用) 谢谢! ...

cym的博客 8704

Hibernate联合主键

在实际开发中,数据库表之间关系有很多种情况,其中共有一个是联合主键,就是中由两个以上的属性同时担任主键, 今天我们就来学习一下,联合主键怎么设计实体类,以及怎么写实体类对应的配置文件*.hbm.xml, 新建一个项目名称为:06hibernate_composite_id,结构如下: 项目以分数实体类为例, 导入jar包,参见《Hibernate环境搭建和配置》

红桃峰峰 的博客 1306

通义千问AI模型对接飞书机器人-集成飞书机器人(2-2)

http请求地址上一篇百炼平台配置的应用地址。

hefaji的博客 1916

4.2 结构翻模

结构翻模功能可以将DWG文件中的二维图线对象:轴网、墙、柱、梁、基础、房间和面积等快速转换成Revit模型对象,翻模速度快,准确率高。与先前的模盒翻模功能不同,结构翻模不再需要在AutoCAD中提取模型的图线,所有操作在Revit均可完成。(1)翻模程序适用于钢筋混凝土结构的平法DWG文件。(2)将平法中所表示的轴网线,轴网文字,结构柱,梁,结构墙在Revit 中重新建出来。(3) 模盒可以翻出连...

fishbuaa的专栏 1797

hibernate的联合主键

hibernate的联合主键探究

u011526599的专栏 899

LVGL8.x 实体按键与Keypad驱动的无缝对接实战

本文详细解析了LVGL8.x中实体按键与Keypad驱动的两种对接方案:坐标映射的Button方式与事件驱动的Keypad方式。重点阐述了如何模块化裁剪lv_port_indev.c模板文件,并深入讲解了Keypad驱动与Group焦点管理系统的核心协作机制,为无触摸屏的嵌入式设备提供流畅的UI交互解决方案。

weixin_29164497的博客 448

Hibernate联合主键详解

Hibernate联合主键映射  1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起  2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用  联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列。 Hibernate要求具有联合主键的实体类实现Serializable接口

wuseyukui的专栏 2106

链路聚合Eth-trunk以及华为交换机配置实例

链路聚合简介 以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。 目的: 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口

ChaseAug的博客 2万+

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样

stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc

xtqbp的博客 4364

Hibernate 映射视图的联合主键的问题

Hibernate 映射视图会生成联合主键.在查询时,如果联合主键(其实不光是联合主键,单个的主键也是,如果为空,那么返回的整条结果都为空)里有一项值为null,则整个结果返回null. 所以一定要设置不为空,并且组合主键唯一的情况下来设置.如果不能找到这样的主键,可以有下面的解决办法.解决办法:可以把它当表来处理,如果没有唯一的字段,那么要在视图中实现一个 rowid 或者r

清水雨潭 2954

Android11.0(R) MTK 平台开机logo动态替换(by logo.bin方式)

实现的效果 客户提供一张格式为 bmp 的开机logo,在 linux 环境下执行制作 logo.bin 脚本文件, apk 拷贝 logo.bin 文件替换系统原有的bin,然后重启 logo 自动更新。 原理分析 MTK 平台的充电图片和开机logo都是打包到 logo.bin 中的 对应的资源路径在源码 vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo 系统一般预制了很多分辨率文件夹,实际通过 BOOT_LOGO 来确定打包那一个

cczhengv 4588

Hibernate注解映射联合主键的三种主要方式

参考文章: Hibernate注解映射联合主键的三种主要方式 今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateSessionFactory' define...

justlpf的专栏 1155

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Hibernate学习——(七)联合主键映射以及组件映射

如果有时候需要将多个属性合并在一起作为主键,则需要使用使用联合主键映射的形式。 首先将联合主键需要的属性包装在一个class中: ManagerPK.java: package cn.wqy.dao; import java.io.Serializable; public class ManagerPK implements Serializable{ private int mana

WangQYoho的博客 921

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

hibernate联合主键及映射实体类写法

1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列。 Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法,重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同的对象。这反映到程序领域中就是根据

wang_chaoju的专栏 3734

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Hibernate联合主键映射以及组件映射

这次来谈谈联合主键映射,联合主键(表中的主键由两个或两个以上字段组成)。在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学生表,课程表,选课表)。第二种情况就是很常见的情况,即只有一张表,表的主键是由本身的两个字段或以上构成的。比如:公司的财务统计表,其中有字段年份、月份、销售金额。在这张表中

wangyinbin的专栏 2013

Hibernate框架-联合主键映射

Hibernate允许直接将实体类的多个属性映射成联合主键,如果需要直接将实体类的多列映射成联合主键,则该实体类必须满足如下条件:i. 有无参的构造方法 ii. 实现Java.io.Serializable接口 iii. 建议根据联合主键列所映射的属性来重写equals()和hashCode()方法例:import java.io.Serializable; import java.util.D

msidolphin的博客 583
上一篇: easyui在兼容模式下的显示问题
下一篇: Myeclipse又崩了
hello小先生
博客等级 码龄14年 2粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值