java – 带有Hibernate 5的JPA:以编程方式创建EntityManagerFac
这个问题具体是关于以编程方式创建由Hibernate 5支持的JPA EntityManagerFactory,这意味着没有配置xml文件而不使用
Spring.此外,这个问题具体是关于使用Hibernate Interceptor创建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,Interceptor interceptor ) { Configuration cfg = new Configuration(); for( Binding<String,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 ); } (这是一个黑客,因为我正在实例化包含org.hibernate.jpa.internal的EntityManagerFactoryImpl.) 现在,使用Hibernate 5,他们已经更改了EntityManagerFactoryImpl的构造函数,因此上面的代码不起作用.我可以浪费几个小时试图弄清楚如何设置,以便我可以调用该构造函数,但我确信在经过几个Hibernate版本之后,这也将无法工作. 所以,这是我的问题: 有没有人知道实现这个功能的一种漂亮而干净的方式 EntityManagerFactory buildEntityManagerFactory( UnmodifiableMap<String,Interceptor interceptor ) 以编程方式创建一个Hibernate EntityManagerFactory,这意味着没有配置xml文件而不使用Spring而是使用Hibernate Interceptor? 有一个老问题:Hibernate create JPA EntityManagerFactory with out persistence.xml但它有一个旧版本的Hibernate的答案,这已经在这个问题中得到了预期.这是不行的,因为我希望它能够与Hibernate 5一起工作,理想情况下,它不会使用任何弃用或内部的东西,以便有一段时间可以工作的机会. 解决方法
最简单的方法是传递org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor引用,它是对“持久性单元”信息的抽象.在正常的JPA引导中,Hibernate将在persistence.xml上构建一个PersistenceUnitDescriptor(对于JPA所谓的“SE引导”)或在javax.persistence.spi.PersistenceUnitInfo上构建一个PersistenceUnitDescript(对于JPA所谓的“EE引导”).
但它是一个抽象的原因:)你可以创建自己的并传递你想要的Hibernate使用.这个工作的预期方式是从org.hibernate.jpa.boot.spi.Bootstrap开始,例如: EntityManagerFactory emf = Bootstrap.getEntityManagerFactoryBuilder( new CustomPersistenceUnitDescriptor(),Collections.emptyMap() ).build(); ... class CustomPersistenceUnitDescriptor implements PersistenceUnitDescriptor { @Override public Properties getProperties() { final Properties properties = new Properties(); properties.put( AvailableSettngs.INTERCEPTOR,new MyInterceptor( ... ); return properties; } ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |