Java 如何在单例DAO服务中使用EntityManager

Java 如何在单例DAO服务中使用EntityManager,java,jpa,model-view-controller,entitymanager,Java,Jpa,Model View Controller,Entitymanager,我是JavaEE的新手。我正在尝试使用带有DAO和服务层的JPA制作webapp。部分任务不是使用Spring和Hibernate。所以我只能使用JPA 据我所知,服务和Dao应该是单音。我应该在每个数据库操作上获取EntityManager,然后关闭它。我使用GenericDao进行一些操作,在Dao中需要EntityManager作为一个字段。 如何使用它?如何在服务中获取entityManager,在服务中启动事务,并在DAO实现中传递它 下面是我的DAO接口示例 public inter

我是JavaEE的新手。我正在尝试使用带有DAO和服务层的JPA制作webapp。部分任务不是使用Spring和Hibernate。所以我只能使用JPA

据我所知,服务和Dao应该是单音。我应该在每个数据库操作上获取EntityManager,然后关闭它。我使用GenericDao进行一些操作,在Dao中需要EntityManager作为一个字段。 如何使用它?如何在服务中获取entityManager,在服务中启动事务,并在DAO实现中传递它

下面是我的DAO接口示例

public interface GenericDAO<T> {

    void save(T entity);

    void merge(T entity);

    void delete(T entity);
    ...
}

没有休眠的EntityManager?是什么让ORM变得如此强大?Maybee您应该在DAL中使用JDBC,而不是不使用Hibernate的EntityManager。

只使用JPA是一个很好的目标。Spring已经存在很长一段时间了,它有一个特定于供应商的数据
存储库实现。Hibernate更接近JPA(在我看来),但也非常具体。正如您所描述的,
EntityManager
实际上是一个通用DAO。它有persist、merge、find和delete方法以及许多其他方法

为了稍微了解JPA,您可以创建一个带有简单实体的简单项目,然后从那里开始。我有很多这样的“游乐场”项目,但我最简单的一个项目是

主应用程序类:

public class App {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");
        EntityManager em = emf.createEntityManager();
        try {
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            User user = new User();
            em.persist(user);
            tx.commit();
            System.out.println("user=" + user);

            User found = em.find(User.class, 1L);
            System.out.println("found=" + found);
        } finally {
            emf.close();
        }
    }
}
一个简单的
用户
实体:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    public Long getId() { return id; }

    @Override
    public String toString() {
        return "User:"+id;
    }
}
和persistence.xml(位于resources/META-INF目录中):


org.hibernate.ejb.HibernatePersistence
模型用户
当然,还有一个POM文件来引入所有依赖项

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jpa-playground</groupId>
  <artifactId>jpa-playground</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>4.3.11.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hsqldb</groupId>
      <artifactId>hsqldb</artifactId>
      <version>2.2.9</version>
    </dependency>
  </dependencies>
</project>

4.0.0
少年警讯游乐场
少年警讯游乐场
1.0-快照
罐子
org.hibernate
休眠实体管理器
4.3.11.4最终版本
org.hsqldb
hsqldb
2.2.9
弄清楚如何把所有这些放在一起,你就可以尽情地玩JPA了。注意,is使用
Hibernate
作为
JPA
提供程序,但它不使用任何特定于Hibernate的构造


创建服务层通常是通过EJB来完成的,例如,
无状态的
有状态的
bean,为此您需要一个容器,比如
Wildfly
Tomcat EE
,等等。但是,您可以通过创建一个名为
ServiceLayer
的类,并在其中放入
createUser
changeUserName
removeUser
等方法来模拟它们。它将代表应用程序使用EntityManager。

如果您使用Java EE,只需让容器使用
@PersistenceContext
注释注入它,就像您在Spring中所做的那样。不需要关闭它。它应该与当前的JTA事务相耦合。
<persistence 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/persistence_2_0.xsd"
  version="2.0">
  <persistence-unit name="persistence" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>model.User</class>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:standalone" />
      <property name="javax.persistence.jdbc.user" value="sa" />
      <property name="javax.persistence.jdbc.password" value="" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
      <property name="hibernate.hbm2ddl.auto" value="create" />
      <property name="hibernate.show_sql" value="true" />
    </properties>
  </persistence-unit>
</persistence>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jpa-playground</groupId>
  <artifactId>jpa-playground</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>4.3.11.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hsqldb</groupId>
      <artifactId>hsqldb</artifactId>
      <version>2.2.9</version>
    </dependency>
  </dependencies>
</project>