我用这种方式设计DAO类:
public void Class(Class object){
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistUnit");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();
entityManagerFactory.close();
entityManager.close();
}
我的persistence.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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/persistence_2_0.xsd">
<persistence-unit name="persistUnit" transaction-type="RESOURCE_LOCAL">
//.. classes
<properties>
<property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://<hostname>:3306/<schema>"/>
<property name="javax.persistence.jdbc.user" value="<username>"/>
<property name="javax.persistence.jdbc.password" value="<password>"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
</persistence-unit>
</persistence>
还有另一种方法可以做这种操作吗?我的意思是,更复杂?
我正在使用Eclipse Indigo和JPA与EclipseLink 2.3。
答案 0 :(得分:2)
好吧,如果问题是如何设计DAO,你可以在不同的地方找到大量文档,例如Java EE Pattern Catalog。
现在,我认为我没有得到你的代码。你真的有一个名为“Class”的方法吗? (鉴于“Class”是一个保留字,我不认为这是可能的,不是吗?)
无论如何,假设名称是正确且可能的,如果该方法是DAO公共接口的一部分,那么您可以考虑根据以下想法进行重新设计:
您不会在方法中反复初始化Entity Manager Factory以执行事务。这项任务非常昂贵(在计算方面意味着它消耗了大量的时间和资源)。因此,您通常在应用程序的生命周期内初始化工厂一次,并使用它来创建应用程序所需的实体管理器。
根据您正在构建的应用程序类型,实体管理器的处理方式不同。例如,Java EE应用程序可以利用容器管理的事务和应用程序上下文共享。假设您的代码是JSE应用程序的代码,您可以执行以下两项操作之一:a)您可以创建单个实体管理器并与所有DAO共享它,或者您可以为每个用户对话创建实体管理器(最常见的是通过事务管理) )并找到一种注入DAO的方法。
您可能想看一下Google Juice,他们有一种利用控制框架反转为POJO注入实体管理器和事务支持的简洁方法。
您可能想要查看有关JPA实体管理器上下文如何工作的其他答案 Does EntityManager's find() method create new instance of JPA class?