JPA:如何创建DAO类?

时间:2011-09-06 21:37:52

标签: jpa persistence jpa-2.0

我用这种方式设计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。

1 个答案:

答案 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?