`
Turnip_gray
  • 浏览: 5177 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

升级Hibernate带来的ID生成策略问题

阅读更多

之前写了个小应用,用的是嵌入式JavaDB + Hibernate3.6之前的版本(具体记不清了,总之就是buildSessionFactory()还没有过时的时候)

最近想把他换成Hibernate4.2.0。

照理说,只要把buildSessionFactory(),改成这样:

            Properties properties = configuration.getProperties();
            ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(properties);
            serviceRegistry = serviceRegistryBuilder.buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);

 关闭的时候destroy一下:

        if (serviceRegistry instanceof StandardServiceRegistryImpl) {
            ((StandardServiceRegistryImpl) serviceRegistry).destroy();
        }

 就好了。

 

谁成想,在IDE里运行的时候,每次插入一个新的Entity,就告诉我不能插入ID为NULL的记录。

ID明明做了注释:

@GeneratedValue(strategy = GenerationType.AUTO)

 应该插入的时候Hibernate自己生成值的……

 

左找,右找,找不到原因。

正郁闷的时候,随手点了下dist里面打包好的jar……

应用启动之后,新建了一个数据库……

再插入Entity……竟然正常了……

 

这时候注意到,IDE里测试用的数据库,是Hibernate3X生成的。

回想起来,之前用3x的时候,生成的id都是一长串的Long值(看起来比较像根据时间生成的)。

而在别的应用里,Hibernate4.2生成的数据库,id是顺序增加的。

 

怀疑,之前的Hibernate在处理GenerationType.AUTO的时候,是ORM赋值。

而新的Hibernate,会把这个问题交给数据库自己管理。

于是4.2建立的数据库,应该和3x时候不同(带分配ID的功能神马的)。

当用4.2向3x建立的数据库里插入数据的时候,由于ORM和数据库自身都没有分配ID。于是就出现了id为null的情况。

 

不知道serviceRegistry有没有什么属性,能设定:处理GenerationType.AUTO时,优先使用的策略。

目前这么看来,要想升级Hibernate还得写歌数据导入导出……

忒麻烦了,暂时搁置吧……

0
0
分享到:
评论

相关推荐

    hibernate3 注释生成复合主键或者嵌入式主键的方法及实例.doc

    在Hibernate3中,虽然XML配置文件是主要的元数据来源,但随着版本的升级,Annotation逐渐成为更便捷的方式来描述实体类与数据库表之间的映射关系。这篇文档将介绍如何使用Hibernate注解来生成复合主键或嵌入式主键。...

    hibernate5.3框架环境配置成功代码

    12. **懒加载与立即加载**: Hibernate支持懒加载和立即加载策略,懒加载可以延迟关联对象的加载,减少不必要的数据库查询,提高性能。 以上就是关于Hibernate 5.3框架环境配置的基本知识点,具体代码示例可能包括...

    hibernate4注解详尽参考

    3. 主键和生成策略注解:如@Id注解标识实体的主键,@GeneratedValue注解指定主键的生成策略,这可以是自动生成的序列、表格或使用特定算法。 4. 级联操作注解:@Cascade注解用于控制关联实体间的持久化操作,如级联...

    Hibernate 3.6.7.Final.rar

    4. **Criteria查询**:除了传统的HQL(Hibernate Query Language)查询外,3.6版本中Criteria API提供了一种更动态的查询方式,可以直接通过API构建查询条件,适合动态生成查询的情况。 5. **第二级缓存**:在3.6中...

    hibernate的注解形式

    使用`@Id`来标识主键,`@GeneratedValue`指定主键生成策略,如自增。其他属性可使用`@Column`注解: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType...

    达内HIBERNATE学习笔记

    - `native`:根据不同的数据库类型选择合适的生成策略。 #### 2.4 元数据的使用 - **元数据**:描述数据的数据。 - **作用**:用于存储和检索有关实体类的信息,包括类名、表名、字段名等。 - **实现方式**:通过...

    Struts 2.0整合Hibernate 3.2开发注册登录系统

    - `id`字段为主键,采用`native`生成策略。 - `name`和`pwd`分别对应表中的用户名和密码字段。 #### 五、实现注册与登录功能 为了完成注册与登录的功能,还需要编写对应的Action类和DAO层代码。具体的实现步骤...

    hibernate分库的dome

    10. **设计模式**:在分库过程中,可能会遇到一些特定的设计模式,如读写分离、分表分库、分布式ID生成等,理解和应用这些模式能更好地适应分布式环境。 总结来说,"hibernate分库的dome"项目涉及到的主要知识点...

    hibenate串讲

    此外,还深入探讨了Hibernate中的ID生成策略和对象状态变迁,以及各种关联关系的实现方式。通过这些内容的学习,开发者可以更好地掌握Hibernate的使用方法,提高开发效率,同时也能更好地理解和解决实际开发中遇到的...

    JSP-SSH框架搭建(Myeclipse2014+Tomcat8.0+Mysql).pdf

    Hibernate4.2.0是Hibernate ORM的一个版本,它增强了性能,提供了更好的二进制兼容性,支持JPA2.1规范,增加了多租户支持,并引入了新的缓存策略。此外,它还简化了配置,使得与Spring的集成更为流畅。 【环境搭建...

    基于spring注解的SSH2框架集成

    例如,`@Entity`注解标记实体类,`@Table`指定对应的数据库表,`@Id`定义主键,`@GeneratedValue`控制主键生成策略。同时,Hibernate还支持`@ManyToOne`, `@OneToMany`, `@OneToOne`, `@ManyToMany`等注解处理关联...

    java常见错误集

    18. **LazyInitializationException**:这是Hibernate中的延迟加载异常,可能是因为未在查询中启用fetch策略。使用`@Fetch(FetchMode.JOIN)`来解决。 19. **IdentifierGenerationException**:高位表未初始化,比如...

    Grails入门指南

    3. **ORM问题与解决方案**:针对ORM常见的性能瓶颈,如N+1查询问题,Grails提供了缓存策略和批量加载机制。 七、Grails的持续发展与更新 1. **Grails升级**:定期跟踪Grails框架的更新,利用官方文档或社区资源,...

    分布式应用层中间件的设计

    这可能需要额外的设计和策略,例如使用全局序列号或分布式ID生成服务。 6. **查询和排序**:由于数据分布在不同的物理数据库和表中,查询时需要跨数据库合并结果并进行排序。DDLM需要提供机制来协调这些操作,确保...

    用java做的超市进存管理系统

    4. 销售管理:记录商品的销售数据,包括销售日期、数量、售价等,支持销售单的管理和统计分析,以便了解销售趋势和制定营销策略。 5. 报表与统计:系统能自动生成各类报表,如进货报表、销售报表、库存报表等,帮助...

    java web 在线订餐系统

    - 订单创建:用户选择菜品后,提交订单,模型层处理订单详情,生成订单ID。 - 订单管理:用户可查看、修改、取消订单,管理员可处理订单状态,如确认、发货、退款等。 - 支付接口:集成第三方支付平台(如支付宝...

    ormlite说明

    ORMLite自身没有硬性依赖,但根据项目需求可能引入额外的库,如Spring或Hibernate。 - **5.7 使用数据库事务** 数据库事务确保数据操作的完整性和一致性,ORMLite支持在DAO操作中嵌套事务。 - **5.8 对象缓存**...

    1剑盛二面准备试题.txt1剑盛二面准备试题.txt

    48. **多线程锁的升级原理**:当一个线程试图访问同步代码块时,它首先检查锁标记,如果该锁没有被任何线程拥有,该线程会获得该锁,并标记为该线程拥有。如果该锁已经被其他线程持有,正在执行的线程要么等待,要么...

Global site tag (gtag.js) - Google Analytics