博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate 多对多 中间表主键问题 及id生成方式
阅读量:5750 次
发布时间:2019-06-18

本文共 1559 字,大约阅读时间需要 5 分钟。

hibernate
多对多中间表,一般都是两个外键,例如 
用户表(user),主键:
userid. 
角色表(role),主键:
roleid. 
中间表字段为两个外键:userid,roleid作为联合主键。
 
但是如果想在中间表加一个字段作为单独的主键,即设置一个字段id作为主键。并且数据库采用的是oracle数据库,主键不能自增。那么采用hibernate向中间表插数据的时候,就会出现问题,即主键id字段插入为空,会报错误。
 

由于oracle不支持自动编号,为解决以上错误,我们还得为oracle数据库创建一个SEQUENCE(序列)语句如 

create sequence t_user_role_seq cache 20 increment by 1 start with 100 nomaxvalue;
在hibernate中的映射文件可这么写

 

 
  1. <id name="id" type="java.lang.Long" column="ID"> 
  2.          <generator class="sequence" > 
  3.             <param name="sequence"> t_user_role_seq </param> 
  4.          </generator> 
  5. </id> 

小结:
对于oracle数据库:
如果单纯的多对多关系不生成中间表的配置文件那中间表就不要ID主键,只要userid和roleid两个外键。
如果中间表设置一个字段id作为主键,那么就需要配置中间表文件,并设置sequence,这是因为oracle的主键不会自动增加,需要通过设置sequence来增加。
 
 

附录:id生成方式 

1,序列sequence 只适用于Oracle

 
  1. <id name="id" column="id"> 
  2. <generator class="sequence"> 
  3. <param name="sequence">person_seq</param><!--指定sequence名--> 
  4. </generator> 
  5. </id> 

2
,自增列,适用于SQLServer、MySql

 

 
  1. <id name="id" column="id"> 
  2. <generator class="identity"/> 
  3. </id>

3
,取最大值加一 
<id name="id" column="id" type="integer"> 
<generator class="increment"/> 
</id>

4
,根据底层数据库指定生成方法
<id name="id" column="id"> 
<generator class="
native"/>
</id>

使用缺省策略 
针对Oracle数据库的生成方式还是sequence,只不过需要一个特定名字的sequence,"hibernate_sequence"。
 
5,高低位算法
<id name="id" column="id"> 
<generator class="hilo"> 
<param name="table">high_value</param> 
<!--
设置高位值取值的表 --> 
<param name="column">next_value</param> 
<!--
设置高位值取值的字段 --> 
<param name="max_lo">50</param> 
<!--
指定低位最大值,当取道最大值是会再取一个高位值再运算 --> 
</generator> 
</id>

以上是hilo算法的普通形式,不适合用于squenece 
在一个会话中保存多个对象
 
本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/202604,如需转载请自行联系原作者
你可能感兴趣的文章
3.python开发语言的特点
查看>>
Nginx使用Proxy_cache实现服务器端静态文件缓存
查看>>
lamp+nginx代理+discuz+wordpress+phpmyadmin搭建一
查看>>
微软原版Windows 8 原版镜像
查看>>
nagios监控使用139邮箱报警
查看>>
Windows Phone 7 中各种Task解说(启动器与选择器)
查看>>
ArcGIS网络分析之Silverlight客户端最近设施点分析(四)
查看>>
罗森伯格助力2011年中国智能建筑技术发展应用论坛哈尔滨站
查看>>
mysql之主从复制
查看>>
linux搭建FTP服务
查看>>
网络割接
查看>>
mysql主从复制及失败切换
查看>>
windows server 2016 活动目录(二)
查看>>
c#异步通讯的例子
查看>>
openstack G版 修改vm的flavor级别
查看>>
雷林鹏分享:codeigniter框架文件上传处理
查看>>
python_控制台输出带颜色的文字方法
查看>>
java泛型中特殊符号的含义
查看>>
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
在centos7下用http搭建配置svn服务
查看>>