了解JPA中的Persistence.xml

时间:2011-10-14 16:45:42

标签: java java-ee jpa ejb persistence.xml

我想了解以下事项:

当我创建一个EJB项目并将其部署到Glassfish时,我是否在Glassfish的管理员中心设置了JDBC资源/连接池,还是在persistence.xml中添加了用户名,密码等所有不同的属性?我不明白这一点。

我不明白为什么我们同时拥有JDBC资源和JDBC连接池。它是什么,它们之间有什么区别?有人可以解释我这些东西或/并提供一些关于persistence.xml文件及其周围部分的良好链接吗?

3 个答案:

答案 0 :(得分:5)

最好定义JDBC资源,而不是将信息放在persistence.xml中。通过这种方式,您将利用连接池。您将在persistence.xml中定义为JDBC资源提供的JNDI名称。

  

它是什么,它们之间有什么区别

下面我粘贴了Glassfish 3.x帮助的部分内容。看看这个。这真的很有帮助

JDBC连接池

JDBC连接池包含一组在注册连接池时创建的JDBC连接

JDBC资源

Java数据库连接(JDBC)资源(数据源)为应用程序提供了连接数据库的方法。通常,管理员为域中部署的应用程序访问的每个数据库创建JDBC资源;但是,可以为数据库创建多个JDBC资源。

应用程序通过在Java命名和目录接口(JNDI)API树上查找数据源然后请求连接,从连接池获取数据库连接。与数据源关联的连接池提供与应用程序的连接。

将数据源(JDBC)资源视为某种类型的数据服务(连接池)的外观的工厂。在这种情况下,它隐式地从池中获取连接并将其提供给您的应用程序。

示例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="WebApplication2PU" transaction-type="JTA">
    <jta-data-source>jdbc/sample</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

这一行是我给我的JDBC资源的JNDI名称:

 <jta-data-source>jdbc/sample</jta-data-source>

您不需要以这种方式在persistence.xml中定义与数据库连接相关的任何内容......只需要资源的JNDI名称

答案 1 :(得分:0)

在应用程序服务器中配置数据源时,在persistence.xml中设置的所有内容都是该数据源的JNDI名称。

答案 2 :(得分:0)

我在学习Spring和Hibernate的书中发现了这一点。书名是由 Nicholas S. Williams 编写的 Web应用程序专业Java 。我认为这对很多人都有帮助。

  

创建持久性配置:

     

要使用您创建的实体,您必须定义持久性单元。这样做很简单。创建一个   persistence.xml文件与部署描述符没有什么不同,但选项少得多   担心。持久性配置文件的根元素是<persistence>。这个   元素可以包含一个或多个<persistence-unit>元素。没有其他元素   在<persistence>内。 <persistence-unit>有两个属性:name指定名称   持久性单元和事务类型指示此持久性单元是否使用Java   事务API(JTA)事务或标准本地事务。   您必须指定一个名称,这是您在代码中找到持久性单元的方式。如果没有指定,   transaction-type缺省为Java EE应用程序服务器中的JTA和Java中的RESOURCE_LOCAL   SE环境或简单的Servlet容器。但是,为了防止意外行为,最好   始终显式设置此值,而不是依赖于默认值。   <persistence-unit>包含以下内部元素。它们都不是必需的(所以   <persistence-unit>可能是空的);但是,您必须指定您在中使用的任何元素   以下顺序:

     
      
  • <description>包含此持久性单元的有用说明。虽然它有   更容易阅读持久性文件,它没有语义价值。
  •   
  • <provider>指定javax.persistence.spi的完全限定类名   .PersistenceProvider实现用于此持久性单元。默认情况下,当你   查找持久性单元,API将使用类路径上的第一个JPA提供程序。您   可以包含此元素来强制要求特定的JPA提供者。

  •   
  • 您可以使用<jta-data-source><non-jta-data-source>(但不能同时使用两者)   使用JNDI DataSource资源。您只能使用<jta-data-source>   事务类型是JTA;同样,您可以仅使用<non-jta-data-source>   如果transaction-type是RESOURCE_LOCAL。指定DataSource会导致持久性   单位将该DataSource用于所有实体操作。

  •   
  • <mapping-file>指定XML映射文件的类路径相对路径。如果你不这样做   指定任何<mapping-file>,提供程序查找orm.xml。您可以指定多个   <mapping-file>元素使用多个映射文件。

  •   
  • 您可以使用一个或多个<jar-file>元素来指定JAR文件或JAR文件   JPA提供程序应扫描映射注释的实体。任何@Entity,@ Embeddable,   @ javax.persistence.MappedSuperclass,或@javax.persistence.Converter类   找到的内容会添加到持久性单元中。

  •   
  • 您可以使用一个或多个<class>元素来表示特定的@Entity,@ Embeddable,   应该添加到持久性单元的@MappedSuperclass或@Converter类。   您必须使用JPA注释注释一个或多个类。

  •   
  • 使用<exclude-unlisted-classes /><exclude-unlisted-classes>true</exclude-unlisted-classes>表示提供者不应忽略类   使用<jar-file><class>指定。省略<exclude-unlisted-classes>或使用   <exclude-unlisted-classes>false</exclude-unlisted-classes>导致JPA   提供程序扫描JPA注释类的持久性文件的类路径位置。如果   persistence.xml位于JAR文件中,该JAR文件(仅限该JAR文件)被扫描   对于课程。如果persistence.xml位于基于目录的类路径位置(例如/   WEB-INF / classes),扫描该目录(并且只有该目录)的类。之前   Hibernate 4.3.0和Spring Framework 3.2.5,指定此元素的值为false   被错误地解释为真。

  •   
  • <shared-cache-mode>表示如何在持久性单元中缓存实体(如果是JPA   provider支持缓存,这是可选的)。 NONE禁用缓存,而ALL启用   缓存所有实体。 ENABLE_SELECTIVE意味着只有实体注释了@javax   .persistence.Cacheable或@Cacheable(true)(或在orm.xml中标记为可缓存)   被缓存。 DISABLE_SELECTIVE导致除注释之外的所有实体的缓存   @Cacheable(false)(或在orm.xml中标记为不可缓存)。默认值,   未知,意味着JPA提供商决定有效默认值是什么。过冬   ORM默认为ENABLE_SELECTIVE,但依赖于此是不可移植的。

  •   
  • <validation-mode>表示是否以及如何将Bean Validation应用于实体。   NONE表示未启用Bean Validation,而CALLBACK表示提供程序   验证插入,更新和删除的所有实体。 AUTO具有CALLBACK的有效值   如果类路径上存在Bean Validation提供程序,则有效值为NONE(如果不存在)   Bean Validation提供程序存在于类路径中。如果启用验证,则为JPA提供程序   配置新的Validator以验证您的实体。如果您已配置特殊   Spring Framework Validator包含您的自定义本地化错误代码,JPA提供程序   忽略它。因此,最好将验证模式设置为NONE并使用Bean Validation   在调用持久层之前。

  •   
  • <properties>提供了一种指定其他JPA属性的方法,包括标准JPA   属性(例如JDBC连接字符串,用户名和密码或模式生成   设置)以及特定于提供程序的属性(例如Hibernate设置)。你指定   一个或多个使用嵌套元素的属性,每个属性都有一个名称和值   属性。

  •   

Nicholas S. Williams, Professional Java for Web Applications, (Indianapolis, Indiana: John Wiley & Sons, Inc., 2014), pg 584-585