JPA:如何创建一个DAO类?

问题描述:

我设计一个DAO类是这样的:JPA:如何创建一个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> 

这里也有一些其他的方式做这种手术?我的意思是,更复杂?

我在EclipseLink 2.3中使用Eclipse Indigo和JPA。

好吧,如果问题是如何设计一个DAO,你可以在不同的地方找到大量的文档,如Java EE Pattern Catalog

现在,我不认为我得到您的代码。你真的有一个名为“类”的方法? (我不认为这是可能的,因为“类”是保留字,不是吗?)

无论如何,假设名称是正确和可能的,如果该方法是您的DAO的公共接口的一部分,那么您可能会考虑根据以下想法进行重新设计:

您不需要一次又一次地初始化实体管理器工厂,只需执行一次事务即可。这项任务相当昂贵(以计算术语来说,它耗费大量时间和资源)。因此,您通常在您的应用程序的生命周期中初始化您的工厂,并使用它来创建尽可能多的实体管理器以满足您的应用程序的需要。

根据您正在构建的应用程序的类型,实体管理器的处理方式会有所不同。例如,Java EE应用程序可以利用容器管理的事务和应用程序上下文共享。假设您的代码是JSE应用程序的代码,您可以执行以下两项操作之一:a)您可以创建单个实体管理器并与所有DAO共享它,也可以为每个用户对话创建一个实体管理器(最常见的是通过事务)并找到注入您的DAO的方法。

你可能想看看Google Juice,他们有一个整洁的方式注入实体管理器和事务支持POJOs使用他们的控制框架的反演。

您可能要检查JPA实体管理器上下文如何工作 Does EntityManager's find() method create new instance of JPA class?

+0

Java是大小写敏感的这个其他的答案。 'Class()'作为方法名是完全有效的,但'class()'不是。无论如何,我确实不会使用它。 – BalusC

+0

没有edalorzo,它只是作为例子=) –

+0

感谢帮助家伙 –