问题一
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升级遇到的问题,作出的总结,仅供参考。
解决问题时参考的相关链接