首页 > Web开发 > 详细

hibernate多对多中间表设计

时间:2016-08-02 23:40:30      阅读:352      评论:0      收藏:0      [点我收藏+]

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中的映射文件可这么写 <id name="id" type="java.lang.Long" column="ID"> <generator class="sequence" > <param name="sequence"> t_user_role_seq </param> </generator> </id>

小结: 对于oracle数据库: 如果单纯的多对多关系不生成中间表的配置文件那中间表就不要ID主键,只要userid和roleid两个外键。 如果中间表设置一个字段id作为主键,那么就需要配置中间表文件,并设置sequence,这是因为oracle的主键不会自动增加,需要通过设置sequence来增加。 附录:id生成方式 1,序列sequence 只适用于Oracle <id name="id" column="id"> <generator class="sequence"> <param name="sequence">person_seq</param><!--指定sequence名--> </generator> </id>

2,自增列,适用于SQLServer、MySql <id name="id" column="id"> <generator class="identity"/> </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 在一个会话中保存多个对象

========================== <id name="id" type="java.lang.Long"> <column name="ID" precision="22" scale="0" /> <generator class="sequence"> <!--采用Oracle的Sequence机制--> <param name="sequence">INPUT_USER_INFO_SEQ</param> </generator> </id>

hibernate多对多中间表设计

原文:http://www.cnblogs.com/lijibiao/p/5731012.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!