如何在Servies中使用Singleton DAO中的EntityManager

时间:2016-03-02 21:58:09

标签: java jpa model-view-controller entitymanager

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

据我所知,Service和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。在实现中,所有这些方法都将使用EntityManager。所以我需要它作为一个领域。
那么如何在我的DAO实现中传递EntityManager并仍然使所有这些构造线程安全? 我不认为像这样的制作方法是个好主意:

 void save(T entity, EntityManager entityManager);
 void merge(T entity, EntityManager entityManager);

2 个答案:

答案 0 :(得分:0)

没有Hibernate的EntityManager?什么会使ORM成为它?也许你应该在DAL中使用JDBC而不是没有Hibernate的EntityManager。

答案 1 :(得分:0)

仅使用JPA是一个很好的目标。 Spring已经存在了很长时间,并且具有特定于供应商的数据repositories实现。 Hibernate更接近JPA(在我看来),但也非常具体。 EntityManager实际上是您描述的通用DAO。它具有持久化,合并,查找和删除方法,以及许多其他方法。

为了学习JPA,您可以使用简单的实体创建一个简单的项目并从那里开始。我有很多这样的“游乐场”项目,但我最简单的项目是Geoffroy Warin

的礼貌

主要App类:

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();
        }
    }
}

一个简单的User实体:

@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目录):

<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>

当然,还有一个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>

弄清楚如何把所有这些放在一起,你可以用JPA来玩你的心灵内容。请注意,它使用Hibernate作为JPA提供程序,但它不使用任何特定于hibernate的构造。

通常使用EJB(例如statelessstatefull bean来创建服务层,为此你需要一个像WildflyTomcat EE这样的容器。 。但是,您可以通过创建名为ServiceLayer的类并将createUserchangeUserNameremoveUser等类似的方法放入其中来模拟它们。它将代表应用程序使用EntityManager。