我是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);
答案 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(例如stateless
和statefull
bean来创建服务层,为此你需要一个像Wildfly
或Tomcat EE
这样的容器。 。但是,您可以通过创建名为ServiceLayer
的类并将createUser
,changeUserName
,removeUser
等类似的方法放入其中来模拟它们。它将代表应用程序使用EntityManager。