这个问题专门关于以编程方式创建EntityManagerFactory
由 Hibernate 5 支持的 JPA,这意味着没有配置 xml 文件,也没有使用 Spring。此外,这个问题专门关于EntityManagerFactory
使用 Hibernate Interceptor创建一个。
我知道如何以我想要的方式创建 Hibernate SessionFactory
,但我不想要 Hibernate SessionFactory
,我想要一个EntityManagerFactory
由 Hibernate 支持的 JPA SessionFactory
。给定 aEntityManagerFactory
有一种获取底层的方法SessionFactory
,但是如果你拥有的是 aSessionFactory
并且你想要的只是一个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.0Ejb3Configuration
被删除,所以我不得不利用这个 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,因为我正在实例化EntityManagerFactoryImpl
package org.hibernate.jpa.internal
。)
现在,随着 Hibernate 5 他们改变了 的构造函数EntityManagerFactoryImpl
,所以上面的代码不起作用。我可能会浪费几个小时试图弄清楚如何进行设置,以便我可以调用该构造函数,但我确信在几个 Hibernate 版本之后,它也不会再工作了。
所以,这是我的问题:
有谁知道实现这个功能的好方法
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor )
以便以EntityManagerFactory
编程方式创建 Hibernate ,这意味着没有配置 xml 文件并且不使用 Spring但使用 Hibernate 拦截器?
有这个老问题:Hibernate create JPA EntityManagerFactory with out persistence.xml但它有一个旧版本的 Hibernate 的答案,这个问题已经预料到了。那是不行的,因为我希望它与 Hibernate 5 一起工作,理想情况下,以不使用任何已弃用或内部的方式,以便有一些机会在很长一段时间内工作。