关于Hibernate使用组合主键时,组合主键中有些字段为null时的解决方法
2011-12-16 16:21
471 查看
当使用视图进行查询的时候,经常会使用组合主键的方式。
在hibernate中,配置在组合主键中的字段,若只要有一个的值为null那么,hibernate会将整行对应的实体置为null。
有时候,这并不是我们想要的。
网上比较多的解决方法就是:把可能为null的字段放到组合主键以外。
但是这样的话,组合主键里的字段就有可能不能唯一地标记一条记录,这样查询出来的结果往往也不是我们想要。
例如:原本有下面一个视图
我想查询某年某学院某位老师的获奖数量,这时候使用联合主键,包含年份,院系,姓名三个字段。
如果不采取任何手段,那么使用hibernate返回的结果列表第二条记录对应的实体为null,但是如果只使用年份跟院系作为联合主键,那么就不能区分这两条记录了。
我们可以这样做:
在创建视图的时候设置一列为ID,让ID的值为组合主键中的值的连接。
这样上面的视图就会变为
这样当在hibernate中映射的时候就可以只映射一个字段ID作为主键,主键的生成方式为assigned,这样避免使用组合主键了,从而就没有了组合主键所带来的问题。
当然这种方法需要保证这三个字段至少有一个不为null。
在hibernate中,配置在组合主键中的字段,若只要有一个的值为null那么,hibernate会将整行对应的实体置为null。
有时候,这并不是我们想要的。
网上比较多的解决方法就是:把可能为null的字段放到组合主键以外。
但是这样的话,组合主键里的字段就有可能不能唯一地标记一条记录,这样查询出来的结果往往也不是我们想要。
例如:原本有下面一个视图
年份 | 院系 | 姓名 | 获奖数量 |
2010 | 计算机学院 | 张三 | 26 |
2010 | 计算机学院 | null | 27 |
如果不采取任何手段,那么使用hibernate返回的结果列表第二条记录对应的实体为null,但是如果只使用年份跟院系作为联合主键,那么就不能区分这两条记录了。
我们可以这样做:
在创建视图的时候设置一列为ID,让ID的值为组合主键中的值的连接。
create or replace view myview as select v1.年份||v1.院系||v1.姓名 as id...................................
这样上面的视图就会变为
ID | 年份 | 院系 | 姓名 | 获奖数量 |
2010计算机学院张三 | 2010 | 计算机学院 | 张三 | 26 |
2010计算机学院 | 2010 | 计算机学院 | null | 27 |
当然这种方法需要保证这三个字段至少有一个不为null。
相关文章推荐
- 关于使用super.getHibernateTemplate()中的方法报java.lang.NullPointerException的解决办法
- 关于使用 Okhttps,response.body().byteStream(),用decodeStream解析,Bitmap为null的解决方法
- 关于hibernate方式获取记录的时候字段为空就获取空记录的解决方法
- 关于Hibernate里一对多查询结果为null的解决方法
- 组合主键在hibernate中的使用方法
- 关于hibernate查询,数据库字段为clob的错误原因及解决方法记录
- hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
- 关于hibernate注解组合主键使用
- 关于jQuery版本的兼容性--使用jquery插件报错:$.browser is undefined的解决方法
- MyEclipse中使用Hql编辑器找不到Hibernate.cfg.xml文件解决方法
- 关于安装IE8之后VS2008使用MFC出现问题的解决方法
- 关于使用EmguCV出现 “无法加载 DLL“cvextern”: 找不到指定的程序” 的解决方法
- 关于Java中使用split()方法时报ArrayIndexOutOfBoundsException数组越界异常解决方法
- 关于Listview 使用过程中 的一些问题及 解决方法
- Hibernate update方法,只更新指定字段,已解决
- 关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法
- logback日志项目使用方法 - 150205交易模块添加日志信息logback,orderNo订单号为log主键便于跟踪,数字常量化,解决取消支付BUG,弱网络环境原因
- 关于更改ip后dbconsole服务不能启动(em不能使用)问题的根本解决方法
- 关于tensorboard的使用不显示的问题解决方法
- 关于“使用EZ-USB Control Panel 烧写EEPROM不成功”的一种解决方法