[英]How to set a DataSource on a JPA EntityMangerFactory that is not from JNDI
我对JPA相当陌生,曾经使用过JDO(DataNucleus)和Hibernate。
我了解了如何为JPA配置设置persistence.xml
,但我需要进行一些调整。 我想在EntityManagerFactory
提供实际的DataSource
对象,而不是在XML中指定DataSource
。 之所以需要这样做,是因为我创建和管理自己的DataSource
对象,并且不依赖于容器来执行此操作,因此,我不能(也不希望)通过persistence.xml
的JNDI名称查找DataSource
。
因此,如何将DataSource
对象提供给EntityManagerFactory
而不是在persistence.xml
指定它? 我无法想象很难做到,但似乎找不到,而且我到处都看了。
如果有帮助,我将使用Hibernate 4作为JPA提供程序(实际上,我正在从3.6过渡到Ejb3Configuration
类消失的4)。 希望我可以以非Hibernate特定的方式进行操作,但是如果我必须使用Hibernate特定的API的话,这并不是什么大问题。
谢谢!!!
-Ryan
我自己想不出任何办法,所以我用Spring来做。 这并不一定很糟,除了它需要我进口六个以前不打算使用的罐子外。 我最终还是将它们用于其他用途,但是,我仍然认为JPA的真正失败是,它甚至不能使用API来设置数据源,而必须依赖于容器提供的数据源。
我用Spring的LocalContainerEntityManagerFactoryBean
来完成这项工作。 它从persistence.xml
读取配置数据,然后我通过Spring API设置DataSource
。 Spring使用DataSource
覆盖persistence.xml
中定义的内容。
代码如下所示。 请注意对afterPropertiesSet
方法的调用。 这是必需的,因为我的应用程序不将Spring用于依赖项注入或AOP,而是将Guice用于这些任务。 如果不调用afterPropertiesSet
方法,则对getNativeEntityManagerFactory
的调用将返回null。
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setPersistenceUnitName("persistenceUnitName");
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factoryBean.afterPropertiesSet();
EntityManagerFactory factory = factoryBean.getNativeEntityManagerFactory();
如果您不使用Spring,则可以直接执行以下操作:
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.nonJtaDataSource", createDataSource());
props.put("javax.persistence.transactionType", "RESOURCE_LOCAL");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitName", props);
属性javax.persistence.nonJtaDataSource
被记录为JNDI URL,但使用Hibernate 5.1.4.Final可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.