`
longxiaoyan
  • 浏览: 75749 次
  • 性别: Icon_minigender_1
  • 来自: 桂-京
社区版块
存档分类
最新评论

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中的映射文件可这么写:
  <id name="id" type="java.lang.Long" column="ID"> 
           <generator class="sequence" >
              <param name="sequence"> t_user_role_seq </param>
           </generator> 
  </id>
小结:
对于oracle数据库:
如果单纯的多对多关系不生成中间表的配置文件那中间表就不要ID主键,只要useridroleid两个外键。
如果中间表设置一个字段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,自增列,适用于SQLServerMySql
<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
在一个会话中保存多个对象

4
0
分享到:
评论
1 楼 meadlai 2010-07-31  
Caused by: java.sql.BatchUpdateException: ORA-02291: 违反完整约束条件 (SYSTEM.MID_TABLE_REF_FK) - 未找到父项关键字
错误,中间表已经添加到hb.cfg里面了。

相关推荐

    hibernate中自动生成主键的办法

    hibernate中自动生成主键的办法

    hibernate-主键生成方式[自动、手动]-annotation

    本文是讲解的是hibernate3.2的主键生成方式,通过annotation来实现,详细的分析了主键在hibernate的生成以及在真实项目的运用。。。。

    Hibernate的主键生成策略

    Hibernate的所有自带的主键生成策略以及XML配置文件的用法

    Hibernate注解映射联合主键

    联合主键用Hibernate注解映射方式主要有三种: 第一、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为@Embeddable,最后在主类中(该类不包含联合主键...

    真实项目中关于主键生成方式的剖析(JPA)

    本资源为原创. 其中剖析了hibernate+JPA对主键的生成方式的分类,以及在真实项目中如何使用,并且剖析各种数据库间的主键序列(sequence)原理以及使用.

    Hibernate用UUID作为主键的Demo

    Hibernate用UUID作为主键的Demo,采用Java默认的方法,来生成对应的ID后,存储到数据库中

    演示怎样在Hibernate中使用复合主键

    该示例应用演示了两张表ITEM和CATEGORY_ITEM表有主外键关系,并且ITEM表的PK(ITEM_ID)是字符串,而CATEGORY_ITEM使用复合主键(CATEGORY_ID, ITEM_ID),FK是ITEM_ID字段。那么,我们这里的解决方案是使用uuid.hex...

    JPA学习笔记-EJB-03JPA主键生成策略总结

    第一种单字段主键类型,看上去简单,无非就是一个id字段呗,实际上这个主键字段在JPA,还有任何的ORM框架中都是有很多种生成策略的。 一般是如下4种: 1. AUTO:自动自增生成 2. TABLE:自定义表生成器 3. Identity...

    hibernate 配置文件 生成工具

    1.采用freeMarker模板来生成代码,真正实现了自定义代码模板; 2.理论上可以生成任何语言的任何所需要的模板; 3.更改了内部逆向工程的实现方式...4.修正了主键ID读取不正确的问题; 5.修正了生成文件编码不正确的BUG;

    hibernate学习笔记

    hibernate多对一关联映射(Hibernate_Many2One) 7 hibernate一对一主键关联映射(单向关联Person----&gt;IdCard) 8 hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射...

    Hibernate笔记 马士兵

    第13课 ID主键生成策略 20 一、 Xml方式 20 元素(主键生成策略) 20 二、 annotateon方式 21 1、AUTO默认 21 2、IDENTITY 22 3、SEQUENCE 22 4、为Oracle指定定义的Sequence 22 5、TABLE - 使用表保存id值 23 三、 ...

    Hibernate注解

    * @ManyToOne 设置多对一关联 * 方法一 * @ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE}) * @JoinColumn(name="外键") * public 主表类 get主表类(){return 主表对象} * 方法二 * @ManyToOne...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    JAVA 的ID生成策略

    主要描述hibernate在Annotation情况下的主键生成策略

    Hibernate_Annotation关联映射

    在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+主表中的主键列名,...

    hibernate配置

    hibernate是一个封装在SQL和JDBC之上的企业级应用框架 配置文件的基本结构如下: &lt;?xml version="1.0" encoding='UTF-8'?&gt;... 主键生成策略"/&gt; &lt;/id&gt; …… &lt;/hibernate-mapping&gt;

    Hibernate 中文 html 帮助文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    hibernate 体系结构与配置 参考文档(html)

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对...

    最全Hibernate 参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    Hibernate教程

    8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖...

Global site tag (gtag.js) - Google Analytics