关于Hibernate使用组合主键时,组合主键中有些字段为null时的解决方法

本文介绍了一种解决Hibernate中组合主键包含null值导致实体映射为null的问题的方法,通过创建视图并使用组合字段作为ID来确保唯一性和查询准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当使用视图进行查询的时候,经常会使用组合主键的方式。

在hibernate中,配置在组合主键中的字段,若只要有一个的值为null那么,hibernate会将整行对应的实体置为null。

有时候,这并不是我们想要的。

网上比较多的解决方法就是:把可能为null的字段放到组合主键以外。

但是这样的话,组合主键里的字段就有可能不能唯一地标记一条记录,这样查询出来的结果往往也不是我们想要。


例如:原本有下面一个视图

年份院系姓名获奖数量
2010计算机学院张三26
2010计算机学院null27

我想查询某年某学院某位老师的获奖数量,这时候使用联合主键,包含年份,院系,姓名三个字段。

如果不采取任何手段,那么使用hibernate返回的结果列表第二条记录对应的实体为null,但是如果只使用年份跟院系作为联合主键,那么就不能区分这两条记录了。

我们可以这样做:

在创建视图的时候设置一列为ID,让ID的值为组合主键中的值的连接。

create or replace view myview as
select v1.年份||v1.院系||v1.姓名 as id...................................

这样上面的视图就会变为

ID年份院系姓名获奖数量
2010计算机学院张三2010计算机学院张三26
2010计算机学院2010计算机学院null27

这样当在hibernate中映射的时候就可以只映射一个字段ID作为主键,主键的生成方式为assigned,这样避免使用组合主键了,从而就没有了组合主键所带来的问题。

当然这种方法需要保证这三个字段至少有一个不为null。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值