hibernate中联合主键的使用

在Hibernate中使用联合主键作为外键         近期遇到一个ORM映射需求,即在“多-多”关系中需要将对应到两端实体的外键作为关系的联合主键,查了N多资料,试了N种方法,终于找到了自认为比较合理的ORM映射方式,在这里贴出来,与大家分享一下。         1、问题描述        这是一个古老的订单问题,涉及到的对象有3个,分别为:订单,订单项,产品。订单与产品间是“多-一”关系,它们间的关系通过订单项来反映:一个 阅读详情

在java后台权限设置时需要使用联合主键来唯一标识权限


public class SystemPrivilegePK implements Serializable{


	private static final long serialVersionUID = 1L;

	private SystemPrivilegePK id;
	private String model;
	private String privilege;
	public SystemPrivilegePK(){}
	public SystemPrivilegePK(String module, String privilege2) {
		
	    this.model = module;
	    this.privilege = privilege2;
	}
	
	get和set方法省略
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((model == null) ? 0 : model.hashCode());
		result = prime * result + ((privilege == null) ? 0 : privilege.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SystemPrivilegePK other = (SystemPrivilegePK) obj;
		if (model == null) {
			if (other.model != null)
				return false;
		} else if (!model.equals(other.model))
			return false;
		if (privilege == null) {
			if (other.privilege != null)
				return false;
		} else if (!privilege.equals(other.privilege))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "SystemPrivilegePK [model=" + model + ", privilege=" + privilege + "]";
	}

}
xml配置为:

<class name="com.robin.main.privilege.systemprivilege.SystemPrivilegePK" table="SYSTEMPRIVILEGEPK">
        <composite-id name="id" class="com.robin.main.privilege.systemprivilege.SystemPrivilegePK">
            <key-property name="model" column="model" type="string"></key-property>
            <key-property name="privilege" column="privilege" type="string"></key-property>
            
        </composite-id>
</class>

public class SystemPrivilege {
	
	private SystemPrivilegePK id;
	private String name;
	private Set<PrivilegeGroup> pgs = new HashSet<>();
	
	public SystemPrivilege(){}
	
	public SystemPrivilege(String module, String privilege, String name) {
		this.id = new SystemPrivilegePK(module, privilege);
		this.name = name;
	}
	
	
	public SystemPrivilege(SystemPrivilegePK id) {
		this.id = id;
	}
	

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SystemPrivilege other = (SystemPrivilege) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "SystemPrivilege [id=" + id + ", name=" + name + "]";
	}
}
其中关于外键id的XML配置:
<composite-id name="id" class="com.robin.main.privilege.systemprivilege.SystemPrivilegePK">
           <key-property name="model" column="model" type="string"></key-property>
           <key-property name="privilege" column="privilege" type="string"></key-property>
</composite-id>
<set name="pgs" table="t_sp_pg">
            <key>
               <column name="model"></column>
               <column name="privilege"></column>
            </key>
            
            <many-to-many class="com.robin.main.privilege.systemprivilege.PrivilegeGroup" column="pgs_id"></many-to-many>
</set>

public class PrivilegeGroup {
	
	private Integer groupid;
	private String name;
	private Set<SystemPrivilege> sps = new HashSet<>();
	private Set<Employee> employees = new HashSet<>();
	
        public PrivilegeGroup(){}
	
	public PrivilegeGroup(Integer groupid) {
		this.groupid = groupid;
	}
	

	public void addSystemPrivilege(SystemPrivilege privilege){
		this.sps.add(privilege);
	}

}
xml配置为:
<id name="groupid" type="java.lang.Integer">
            <column name="GROUPID" />
            <generator class="native" />
</id>
<set name="sps" table="t_sp_pg">
            <key column="pgs_id"></key>
            <many-to-many class="com.robin.main.privilege.systemprivilege.SystemPrivilege">
               <column name="model"></column>
               <column name="privilege"></column>
            </many-to-many>
</set>
SystemPrivilege由SystemPrivilegePK作为它的主键,
SystemPrivilegePK需要实现序列化接口,并且需要实现相应的equals和hashcode方法来比较对象是否相等


















 






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

相关推荐

VS Code + Codex 在 WSL 中使用的正确姿势

Codex 登录只能在本地完成。文件仍可通过 UNC 路径访问 WSL → 本地 Codex 就能照常工作。避免在 WSL 内重复安装/登录 Codex 扩展。

yangguangwuyue的博客 9858

hibernate 联合主键

hibernate联合主键

hoho_12 1288

从零实现机械臂抓取仿真:用MoveIt+Gazebo完成物体pick&place全流程

本文详细介绍了如何使用ROS的MoveIt框架与Gazebo仿真环境,从零构建机械臂抓取仿真系统。涵盖环境搭建、MoveIt配置、Gazebo集成、抓取动作实现等全流程,帮助开发者掌握机械臂控制的核心技术,实现高效的pick&place任务。

weixin_29250403的博客 478

Hibernate联合主键

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

红桃峰峰 的博客 1306

多模态RAG实战:为LLM装上视觉之眼,实现图文混合文档智能问答

检索增强生成(RAG)技术通过结合外部知识库,有效缓解了大语言模型(LLM)的幻觉问题,并扩展了其知识边界。其核心原理是将文档切分、向量化后存入向量数据库,在问答时通过语义检索召回相关上下文,辅助LLM生成更精准的答案。这项技术的核心价值在于,它为大模型应用提供了一种低成本、高效率的知识注入与实时更新方案,广泛应用于智能客服、知识库问答、文档分析等场景。随着应用深入,纯文本RAG在处理产品手册、学术论文、设计图纸等富含视觉信息的文档时面临瓶颈。本文聚焦的**多模态RAG**和**视觉理解**技术,正是为了解

weixin_30698527的博客 723

ESP32系列之LVGL(三):Gui-Guider的使用

Gui-Guider的使用

m0_55986987的博客 2万+

hibernate联合主键的使用

转自:http://chengyue2007.javaeye.com/blog/419408<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-ma...

weixin_30443731的博客 135

深入浅出:UE4类型系统完整构建过程详解

UE4的类型系统是一个复杂但设计精巧的架构,它通过静态代码生成和运行时构建的完美配合,实现了强大的反射功能。理解这个过程不仅有助于解决开发中的问题,也能让你更好地利用UE4的各种高级特性。就像建造一栋大楼需要经过设计、备料、框架、装修、验收等多个阶段,UE4类型系统的构建也是一个多阶段、精细化的过程。每个阶段都有其特定的职责,共同协作完成从源代码到运行时对象的转换。

m0_45371381的博客 911

Hibernate实现复合主键的使用

复合主键的使用 1>:首先将要作为主键的属性首先抽取成单独的实体 并提供get And set方法 并且还需要序列化 2>:在实际的实体中申明主键实体的变量 3>:在映射文件中编写实体的配置文件

GuominJin的博客 4730

【元宵快乐】猜灯谜吃元宵 元气满满闹元宵~(附猜灯谜小游戏)

导语 元宵节,又称上元节、灯节,是春节之后的第一个重要节日。 相传,汉文帝(前179—前157年)为庆祝周勃于正月十五勘平诸吕之乱,每逢此夜,必出宫游玩,与民 同乐,在古代,夜同宵,正月又称元月,汉文帝就将正月十五定为元宵节。 随着社会和时代的变迁,元宵节的风俗习惯在不断变化,但至今仍是中国的传统节日。2008年, 元宵节选入第二批国家级非物质文化遗产。 对我而言,除了吃元宵、看花灯……还有一件最重要的事情…就是… 猜灯谜!猜灯谜!!猜灯谜!!!猜谜事小,展现聪明才智事大哈哈哈.jpg .

顾木子吖的博客 2100

华为OD机试双机位C卷-统计差异值大于相似值二元组个数(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【统计差异值大于相似值二元组个数】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 统计差异值大于相似值二元组个数

qq_45776114的博客 784

Hibernate 中的联合主键

<!--google_ad_client = "pub-8509190668429086";/* 728x15, 创建于 08-11-26 */google_ad_slot = "5425291497";google_ad_width = 728;google_ad_height = 15;//-->      今天生成hibernate映射文件

Java突击 1822

30分钟上手YOLO26 nano:INT8量化部署到智能相机,推理速度提升43%

微调代码(仅需5行,数据集遵循COCO格式)data="custom_data.yaml", # 数据集配置文件epochs=20, # 少量轮数即可收敛batch=8,imgsz=640model.save("yolov26n_custom.pt") # 保存微调后的模型本文在30分钟内完成了YOLO26 nano的INT8量化与智能相机部署,核心步骤为环境准备→模型获取→ONNX导出→INT8量化→部署推理。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 988

Hibernate联合主键 以及根据联合主键中字段查询

hibernate里联合主键配置 package="com.boise">        name="PropertyFileBsline" table="property_file_bsline">           name="Id" class="PropertyFileBslinePK">              name="Bslineid" column="bsline

BoiseWu的专栏 7249

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

Hibernate联合主键映射

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

jialinqiang的专栏 3万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

hibernate配置联合主键

首先要看这样一个问题"同样的SQL 在hibernate执行的结果和在PLSQL Developer中执行的结果完全不同".产生的原因是什么呢? 我的神啊,纠结... 还好,第二天,在仔细检查的时候发现了问题产生的原因.是因为数据库的一张表中,有相同的主键,原来这里是要设置联合主键的.... 那联合主键到底是什么东东呢?这个问题,有兴趣的同学可以去查找一下相关资料,至于在实体对应的配置文件中

avinegar的专栏 3822

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Hibernate联合主键的使用

用一个Demo来说明,联合主键的使用 1.新建一个java project,将hibernate需要的jar包,添加进去。目录如下: 2.Student.java package com.lx.domain; import java.io.Serializable; /** * 联合主键要实现implements * 重写hashCode和equals * @author Ad

在风雨中奔跑 575

Hibernate联合主键详解

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

wuseyukui的专栏 2106

Hibernate 使用 Annotation 之 联合主键

hibernate使用annotation注释的方法来映射联合主键查看hibernate文档有三种方法: 1,将主键类注解为@Embeddable,并将主键的属性注解为@Id; 2,将主键的属性注解为@EmbeddedId; 3,将类注解为@IdClass,并将该实体类种的所有属性主键的属性都注解为@Id; 常用的有第二第三种,下面给出三种的例子程序: ---------------主键

liangoo7的专栏 1033

hibernate联合主键

在日常开发中,有时候会出现要求两个或以上字段联合做主键的表,就两个字段做主键为例,用户表的联合主键为firstname和lastname,商品表的联合主键为id和pid等等。而在hibernate中,也提供了composite-id节点,对复合主键进行支持和定义。   为了说的更加详细,我们这里先新建一个T_User表,其中的firstname和lastname为该表的联合主键:

phantomes的专栏 954

慎用hibernate联合主键

OID是hibernate当中一个很重要的概念,没有OID的话hibernate就无法帮你管理持久化对象,但是有的时候数据库中的表是没有主键的,这个时候就不得不使用联合主键来作为OID,有时候是将所有字段联合有时候是部分字段的联合。 在使用hibernate的联合主键时有一下几个注意的问题: 1、首先就是映射文件中联合主键的写法, 例子:     Java代码   "s

ystyaoshengting的专栏 6389

Hibernate 联合主键的设置

在mysql建表时可以设置联合主键,现在要建一个一个user表,user表中有三个字段username,usergroup,sex,将username与usergroup设置为联合主键,建表法如下:CREATE TABLE `user` ( `usergroup` varchar(20) NOT NULL, `username` varchar(20) NOT NULL, `sex` v

Kevin.yang专栏 2465
上一篇: org.hibernate.MappingException: entity class not found
下一篇: JS基础知识
learnerq
博客等级 码龄12年 6粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值