Этот вопрос конкретно о программном создании JPA EntityManagerFactory
с поддержкой Hibernate 5, что означает без конфигурационных XML-файлов и без использования Spring сильный>. Кроме того, этот вопрос конкретно о создании EntityManagerFactory
с Hibernate Interceptor.
Я знаю, как создать Hibernate SessionFactory
так, как я хочу, но мне не нужен Hibernate SessionFactory
, мне нужен JPA EntityManagerFactory
, поддерживаемый Hibernate SessionFactory
. Учитывая 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
был удален, поэтому мне пришлось воспользоваться этим хаком:
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 );
}
(Это взлом, потому что я создаю экземпляр EntityManagerFactoryImpl
из пакета org.hibernate.jpa.internal
.)
Теперь, в Hibernate 5, они изменили конструктор EntityManagerFactoryImpl
, поэтому приведенный выше код не работает. Я могу потратить несколько часов, пытаясь понять, как все настроить, чтобы вызвать этот конструктор, но я уверен, что после пары версий Hibernate это тоже больше не будет работать.
Итак, это мой вопрос:
Кто-нибудь знает хороший и чистый способ реализации этой функции?
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor )
чтобы создать Hibernate EntityManagerFactory
программно, что означает без файлов конфигурации и без используя Spring, но с Hibernate Interceptor?
Возникает старый вопрос: Hibernate создает JPA EntityManagerFactory с out persistence.xml, но у него есть ответ для более старой версии Hibernate, который уже ожидался в этом вопросе. Это не сработает, потому что я хочу, чтобы он работал с Hibernate 5, и в идеале, таким образом, чтобы не использовать ничего устаревшего или внутреннего, чтобы иметь некоторые шансы работать в течение длительного времени.