hibernate 多对多 中间表主键问题 及id生成方式
2010-11-01 14:11
591 查看
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中的映射文件可这么写
小结:
对于oracle数据库:
如果单纯的多对多关系不生成中间表的配置文件那中间表就不要ID主键,只要userid和roleid两个外键。
如果中间表设置一个字段id作为主键,那么就需要配置中间表文件,并设置sequence,这是因为oracle的主键不会自动增加,需要通过设置sequence来增加。
附录:id生成方式
1,序列sequence 只适用于Oracle
2,自增列,适用于SQLServer、MySql
3,取最大值加一
4,根据底层数据库指定生成方法
使用缺省策略
针对Oracle数据库的生成方式还是sequence,只不过需要一个特定名字的sequence,"hibernate_sequence"。
5,高低位算法
以上是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>
用户表(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> |
<id name="id" column="id"> <generator class="identity"/> </id> |
<id name="id" column="id" type="integer"> <generator class="increment"/> </id> |
<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> |
在一个会话中保存多个对象
==========================
<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 多对多 中间表主键问题 及id生成方式
- hibernate初学5 主键ID生成方式
- SS6.1_Hibernate_Hibernate_IdStrategyAnnotation 主键生成策略native Annotation注解的配置方式
- SS6.2_Hibernate_Hibernate_IdStrategyAnnotation 主键生成策略uuid Annotation注解的配置方式
- 【Hibernate】(2)Hibernate的核心接口、增删改查操作、主键ID生成方式、查询方式
- Java-hibernate框架2(1、框架搭建;2、框架接口;3、框架的增删改;4、主键ID生成方式)
- SS5.1_Hibernate_IdStrategyXML ~ SS5.5_Hibernate_IdStrategyXML 主键生成策略 XML映射文件的方式
- Hibernate主键生成方式Key Generator/插入问题
- 【Hibernate框架开发之四】Hibernate-Annotation常用的注解归总&&ID的生成策略&&联合主键
- 关于Hibernate的oracle主键id生成策略uuid、native和sequence
- Hibernate ID生成策略/联合主键解决方案
- Hibernate主键生成方式(转)
- 【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values;
- hibernate联合主键生成机制(annotation方式)
- Hibernate主键生成方式
- Hibernate主键生成方式
- Hibernate主键生成方式 Key Generator
- 剖析Hibernate主键生成几种常用方式
- Hibernate映射文件中的主键生成方式
- Hibernate主键生成方式 Key Generator