【问题标题】:How to create EntityManager from LocalContainerEntityManagerFactoryBean如何从 LocalContainerEntityManagerFactoryBean 创建 EntityManager
【发布时间】:2014-05-10 17:04:13
【问题描述】:

我正在尝试为 JPA DAO 类编写 JUnit 测试。

类的构造器需要一个 EntityManager 所以我正在尝试使用 LocalContainerEntityManagerFactoryBean 创建一个。

一旦我创建了 LocalContainerEntityManagerFactoryBean,我将在其上调用 getObject(),希望检索 EntityManagerFactory 以允许我创建 EntityManager,但 getObject() 返回 Null。

我也尝试过 getNativeEntityManagerFactory(),但它也返回 Null。

我做错了什么?

(我使用 H2 作为数据库,但这应该没什么区别)

代码如下:

Map<String, String> properties = new HashMap<>();
properties.put("javax.persistence.jdbc.driver", "org.h2.Driver");
properties.put("javax.persistence.jdbc.url", "jdbc:h2:mem:MyUnitTest");

Properties addProperties = new Properties();
addProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
addProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");

LocalContainerEntityManagerFactoryBean emfCB = new LocalContainerEntityManagerFactoryBean();
emfCB.setPersistenceProviderClass(org.eclipse.persistence.jpa.PersistenceProvider.class);
emfCB.setPackagesToScan("com.something.mymodel");
emfCB.setPersistenceUnitName("myUnit");
emfCB.setJpaPropertyMap(properties);
//emf.setLoadTimeWeaver(new ReflectiveLoadTimeWeaver()); -> This doesn't work
emfCB.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());

JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emfCB.setJpaVendorAdapter(vendorAdapter);
emfCB.setJpaProperties(addProperties);

EntityManagerFactory emf = emfCB.getObject(); // -> This is Null !

MyDao dao = new MyDao(emf);

【问题讨论】:

  • 你应该使用spring Junit runner 进行那种测试(或一些模拟)
  • 从以下链接查看 Spring Integration Testing 的文档:docs.spring.io/spring/docs/4.0.3.RELEASE/…
  • 谢谢大家,虽然我不想使用模拟(通过使用 H2 我正在模拟数据库,但我希望代码与它进行交互,就好像它是真正的数据库一样,而不是通过模仿等)。 @geoand 我阅读了与 LocalContainerEntityManagerFactoryBean 相关的部分,但那里没有什么非常有用的内容,也没有关于如何创建 EntityManager 的完整示例。
  • 如果您使用集成测试策略(并且已经正确配置了LocalContainerEntityManagerFactoryBean),您可以轻松地在测试中注入EntityManagerFactory,然后您可以从那里检索EntityManager

标签: java spring jpa h2 entitymanager


【解决方案1】:

你需要在调用emfCB.getObject()之前调用LocalContainerEntityManagerFactoryBean#afterPropertiesSet,因为你的emfCB应该在设置完所有必需的属性之后初始化,并且在使用bean之前,这是Spring中the bean lifecycle的一部分。

所以你的代码将是:

...
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emfCB.setJpaVendorAdapter(vendorAdapter);
emfCB.setJpaProperties(addProperties);

emfCB.afterPropertiesSet();
EntityManagerFactory emf = emfCB.getObject(); // -> This won't be Null

MyDao dao = new MyDao(emf);

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 2019-08-16
    • 2013-06-22
    • 2019-05-09
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多