4

我试图了解以下内容:

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

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

4

3 回答 3

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 名称

于 2011-10-14T17:16:34.943 回答
0

当您在应用程序服务器中配置数据源时,您只需要设置persistence.xml该数据源的 JNDI 名称即可。

于 2011-10-14T16:56:31.833 回答
0

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

创建持久性配置:

要使用您创建的实体,您必须定义一个持久性单元。这样做很简单。创建一个与部署描述符没有什么不同的persistence.xml 文件,但要担心的选项要少得多。持久性配置文件的根元素是<persistence>. 该元素可能包含一个或多个<persistence-unit>元素。内没有其他元素<persistence><persistence-unit>有两个属性:name 指定持久化单元的名称,transaction-type 指示这个持久化单元是使用 Java Transaction API (JTA) 事务还是标准本地事务。您必须指定一个名称,这是您在代码中定位持久性单元的方式。如果未指定,则事务类型在 Java EE 应用程序服务器中默认为 JTA,在 Java SE 环境或简单 Servlet 容器中默认为 RESOURCE_LOCAL。但是,为防止出现意外行为,最好始终明确设置此值,而不是依赖默认值。 <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>仅当 transaction-type 为 JTA 时才可以使用;同样,您<non-jta-data-source>只能在事务类型为 RESOURCE_LOCAL 时使用。指定 DataSource 会导致持久性单元将该 DataSource 用于所有实体操作。

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

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

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

  • 使用<exclude-unlisted-classes />or<exclude-unlisted-classes>true</exclude-unlisted-classes>表示提供者应该忽略未使用<jar-file>or指定的类<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 验证应用于实体。NONE 表示未启用 Bean 验证,而 CALLBACK 使提供者在插入、更新和删除时验证所有实体。如果类路径上存在 Bean 验证提供程序,则 AUTO 的有效值为 CALLBACK;如果类路径上不存在 Bean 验证提供程序,则有效值为 NONE。如果您启用验证,JPA 提供程序会配置一个新的验证器来验证您的实体。如果您使用自定义的本地化错误代码配置了特殊的 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

于 2017-04-06T03:51:38.330 回答