这个问题是关于以编程方式创建由Hibernate 5支持的JPA EntityManagerFactory的,意味着不使用配置xml文件和Spring。此外,这个问题是关于创建一个带有Hibernate拦截器的EntityManagerFactory。
我知道如何按照自己的要求创建Hibernate SessionFactory,但我不想要一个Hibernate SessionFactory,我想要一个由Hibernate SessionFactory支持的JPA EntityManagerFactory。如果已经有了一个EntityManagerFactory,那么有一种方法可以获得底层的SessionFactory,但如果你手头只有一个SessionFactory,而你想要的是一个包装在其周围的EntityManagerFactory,似乎就没有办法了。
在Hibernate版本4.2.2中,Ejb3Configuration已被弃用,但似乎没有其他方法来以编程方式创建EntityManagerFactory,所以我正在做类似于以下内容的事情:
@SuppressWarnings( "deprecation" )
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor )
{
Ejb3Configuration cfg = new Ejb3Configuration();
for( Binding<String,String> binding : properties )
cfg.setProperty( binding.key, binding.value );
for( Class<?> annotatedClass : annotatedClasses )
cfg.addAnnotatedClass( annotatedClass );
cfg.setInterceptor( interceptor );
return cfg.buildEntityManagerFactory();
}
在使用Hibernate 4.3.0时,Ejb3Configuration
被删除了,因此我不得不使用这个hack:
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor )
{
Configuration cfg = new Configuration();
for( Binding<String,String> binding : properties )
cfg.setProperty( binding.key, binding.value );
for( Class<?> annotatedClass : annotatedClasses )
cfg.addAnnotatedClass( annotatedClass );
cfg.setInterceptor( interceptor );
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder();
ssrb.applySettings( cfg.getProperties() ); //??? why again?
ServiceRegistry serviceRegistry = ssrb.build();
return new EntityManagerFactoryImpl( PersistenceUnitTransactionType.RESOURCE_LOCAL, /**/
/*discardOnClose=*/true, /*sessionInterceptorClass=*/null, /**/
cfg, serviceRegistry, null );
}
(这是一种hack,因为我正在实例化org.hibernate.jpa.internal
包中的EntityManagerFactoryImpl
。)
现在,随着Hibernate 5的推出,EntityManagerFactoryImpl
的构造函数已经发生了变化,所以以上代码不起作用了。我可以花费几个小时来尝试设置事物,以便可以调用那个构造函数,但我确定在几个Hibernate版本之后,这也不起作用了。
所以,这是我的问题:
有人知道实现此功能的一种好的且干净的方式吗?
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor )
为了通过Hibernate拦截器来在程序中创建EntityManagerFactory
,意味着不需要配置XML文件和不使用Spring。有一个关于这个问题的旧版问答:Hibernate create JPA EntityManagerFactory with out persistence.xml但是它是针对旧版Hibernate的答案,而且已经被此次提问所预料到。那种方法行不通,因为我希望它能在Hibernate 5中工作,并且最好不要使用任何过时或内部的东西,以便长期运行。