不使用 Spring 获取 EntityManager

Posted

技术标签:

【中文标题】不使用 Spring 获取 EntityManager【英文标题】:Obtaining EntityManager without Spring 【发布时间】:2011-05-16 14:51:19 【问题描述】:

我使用的是 hibernate 但不是 Spring,并且刚刚找到 hibernate-generic-dao。 这个概念看起来不错,但是当我运行它时,我得到了一个 NPE,因为我没有调用 setEntityManager()。

如何在不使用 Spring 的情况下获取 EntityManager?

【问题讨论】:

另见code.google.com/p/hibernate-generic-dao/issues/detail?id=77 【参考方案1】:

我有这是一些测试代码。它在 META-INF 目录中查找 persistence.xml 文件。

EntityManagerFactory emf=Persistence.createEntityManagerFactory("test-unit");
EntityManager em=emf.createEntityManager();

这是一个使用 hibernate 连接到 postgresql 数据库和两个实体类的示例 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0"  
             xmlns="http://java.sun.com/xml/ns/persistence"  
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/per\
sistence_1_0.xsd"> 
  <persistence-unit name="test-unit" transaction-type="RESOURCE_LOCAL"> 
    <class>com.example.package.Entity1</class> 
    <class>com.example.package.Entity2</class> 
    <properties> 
      <property name="hibernate.dialect"  
                value="org.hibernate.dialect.PostgreSQLDialect"/> 
      <property name="hibernate.connection.driver_class"  
                value="org.postgresql.Driver"/> 
      <property name="hibernate.connection.username" value="login"/> 
      <property name="hibernate.connection.password" value="password"/> 
      <property name="hibernate.connection.url"  
                value="jdbc:postgresql://dbserver.internal:5432/dbname"/> 
    </properties> 
  </persistence-unit> 
</persistence> 

【讨论】:

Amm ... 我没有 persistence.xml 文件。 你必须创建一个。这就是定义实体类的内容。 不,不是。我正在使用 hibernate.cfg.xml,它看起来不像你发布的那样,而且我的测试正在工作:) 你是说 EntityManager 必须有这个 XML?如果是这种情况,那么目前 hibernate-generic-dao 可能不适合我。 hibernate.cfg.xml 用于本地 Hibernate。 persistence.xml 用于 JPA。如果您打算使用EntityManager,您可能应该使用persistence.xml,因为这是JPA 方法。如果您只想使用 Hibernate,请改用 SessionFactorySession @Steven - 我使用 SessionFactory 和 Session 很好,但我想集成 hibernate-generic-dao,显然它需要 EntityManager。【参考方案2】:

使用 Hibernate 4 和 H2 数据库获取 EntityManager。

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.jpa.internal.EntityManagerFactoryImpl;
import org.hibernate.service.ServiceRegistry;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;

public class Main 

    public static void main(String[] args) 
        Configuration configuration = getConfiguration();

        StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
        serviceRegistryBuilder.applySettings(configuration.getProperties());
        ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

        EntityManagerFactory factory = new EntityManagerFactoryImpl(
                PersistenceUnitTransactionType.RESOURCE_LOCAL, true, null, configuration, serviceRegistry, null);

        EntityManager em = factory.createEntityManager();
    

    private static Configuration getConfiguration() 
        Configuration configuration = new Configuration();
        configuration.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
        configuration.setProperty("hibernate.connection.url", "jdbc:h2:~/test");
        configuration.setProperty("hibernate.connection.pool_size", "1");
        configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        configuration.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.internal.NoCachingRegionFactory");
        configuration.setProperty("hibernate.show_sql", "true");
        configuration.setProperty("hibernate.hbm2ddl.auto", "create");
        configuration.setProperty("hibernate.connection.autocommit", "false");
        configuration.addAnnotatedClass(RegionEntity.class);
        return configuration;
    

依赖关系:

    com.h2database:h2:1.4.178 org.hibernate:hibernate-core:4.3.5.Final org.hibernate:hibernate-entitymanager:4.3.5.Final

【讨论】:

以上是关于不使用 Spring 获取 EntityManager的主要内容,如果未能解决你的问题,请参考以下文章

Spring重定向请求以获取资源到我的控制器,不应该这样做

Doctrine2 存储库是保存我的实体的好地方吗?

Spring-Data 中的父对象不获取子对象

Spring Data JPA 更新行而不获取行 ById

spring

微服务不从 spring-cloud-config-server 微服务获取属性