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