[英]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.