繁体   English   中英

了解JPA中的Persistence.xml

[英]Understanding Persistence.xml in JPA

我想了解以下事项:

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

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

最好定义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名称

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

创建持久性配置:

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

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

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

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

  • 您可以使用一个或多个<jar-file>元素来指​​定JPA提供程序应扫描映射注释实体的JAR文件或JAR文件。 找到的任何@ 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>指定的<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指定此元素被错误地解释为true。

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

  • <validation-mode>指示是否以及如何将Bean Validation应用于实体。 NONE表示未启用Bean Validation,而CALLBACK使提供程序在插入,更新和删除时验证所有实体。 如果类路径上存在Bean Validation提供程序,则AUTO具有CALLBACK的有效值,如果类路径上不存在Bean Validation提供程序,则AUTO的有效值为NONE。 如果启用验证,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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM