Hibernate 4升级到Hibernate 5遇到的两个问题

问题一

Hibernate 4构建SessionFactory的方式与Hibernate 5的构建方式不同。

如果在Hibernate 5的环境下继续使用Hibernate 4的sessionFactory创建方式,那么Configuration或者Metadata对象里面没有项目所映射的Entity,造成项目运行时报错,比如:

org.hibernate.MappingException: Unknown entity: com.xxx.xxx.User

Hibernate 4 SessionFactory创建:

Configuration conf = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                                    .applySettings(conf.getProperties())
                                    .build();
SessionFactory sessionFactory = conf.buildSessionFactory(serviceRegistry);

Hibernate 5 SessionFactory创建:

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder();
                                       .configure()
                                       .builder();
MetadataSources metadataSources = new MetadataSources (serviceRegistry);
SessionFactory sessionFactory = metadataSources.getMetadataBuilder()
                                .build()
                                .getSessionFactoryBuilder()
                                .build();

 

问题二

Hibernate 4 的Entity Mapping设置Sequence与Hibernate 5使用了不同的Param name

Hibernate 4 Entity mapping 设置Sequence:

<hibernate-mapping>
    <class name="com.example.User" table="TB_USER">
       <id name="id" type="long">
            <column name="id" />
            <generator class="sequence">
               <param name="sequence">SEQ_USER_ID</param>
            </generator>
        </id>
        ...
    </class>
</hibernate-mapping>

Hibernate 5 Entity Mapping设置Sequence:

<hibernate-mapping>
    <class name="com.example.User" table="TB_USER">
       <id name="id" type="long">
            <column name="id" />
            <generator class="sequence">
               <param name="sequence_name">SEQ_USER_ID</param>
            </generator>
        </id>
        ...
    </class>
</hibernate-mapping>

注意这一行:

 <param name="sequence">SEQ_USER_ID</param>

如果在Hibernate 5的环境下继续使用Hibernate 4时设置Sequence的方式,Hibernate在运行时会使用Hiberntae默认的Sequence即Hibernate_Sequence。这个时候就有一种潜在的危险,如果项目的Database有Hibernate_Sequence这个Sequence,并且,多个实体对应到这个sequence,项目虽然会正常地运行下去,但是每个实体对应的数据库表里面的记录的id不是连续的,很不容易发现,除非产生主键冲突。如果项目的Database没有Hibernate_Sequence,那么就很容易发现问题,并加以解决。

这篇博客是针对项目hibernate升级遇到的问题,作出的总结,仅供参考。

解决问题时参考的相关链接

https://stackoverflow.com/questions/32405031/hibernate-5-org-hibernate-mappingexception-unknown-entity/32711654#32711654

https://stackoverflow.com/questions/35230317/migrating-hibernate-3-to-5-relation-hibernate-sequence-does-not-exist

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值