微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 带有Hibernate 5的JPA:以编程方式创建EntityManagerFactory

这个问题具体是关于以编程方式创建由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;
    }

    ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?