开发者社区> 余二五> 正文

hibernate 多对多 中间表主键问题 及id生成方式

简介:
+关注继续查看
hibernate多对多中间表,一般都是两个外键,例如 
用户表(user,主键:
userid. 
角色表(role,主键:
roleid. 
中间表字段为两个外键:useridroleid作为联合主键。
 
但是如果想在中间表加一个字段作为单独的主键,即设置一个字段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主键,只要useridroleid两个外键。
如果中间表设置一个字段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
,自增列,适用于SQLServerMySql

 


  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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MyEclipse自动生成hibernate映射文件
http://blog.csdn.net/blacklin520/article/details/6854163
472 0
[Hibernate]xDoclet生成hbm的一个bug
做示范中心项目时遇到的,类Teacher实现接口BusinessObject,在接口里用@hibernate.class,在类里用@hibernate.joined-subclass-key column="oid"和@hibernate.joined-subclass,执行ant任务时只生成了BusinessObject.hbm.xml,而且在里面没有关于Teacher的定义。
801 0
字符串 全排列生成问题
转自:http://blog.csdn.net/zinss26914/article/details/8939140 问题   输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路   1.
792 0
hibernate通过数据库表反向生成实体类
    步骤一: window-->open Perspective-->MyEclipse Java Persistence 进行了上面的 操作后会出现一个视图DB Brower:MyEclipse Derby, 点击右键新建new一个在出现的面板Da...
966 0
大量redo生成的问题原因及改进
接着上次分享的关于数据库无法登录的原因http://blog.itpub.net/23718752/viewspace-1791089/ 其实最终还是因为在短期内生成了大量的redo,造成了频繁的日志切换,导致归档占用了大量的空间,最后无法登录,从这个层面来说,我们可以做一些工作来尽可能长时间的保留近期的归档,但是我们还可以换一个思路,那就是看看到底是什么操作生成了大量的redo,能不能试着减少redo的生成量。
751 0
+关注
20378
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载