1

基础

我正在使用 Spring 2.5.6 和 Hibernate 3.2.1 - 因为我必须部署到不允许干扰其设置的 jboss 4.2.3(因为 jboss 服务器是由脚本构建的,并且脚本是旧的但没有给予投入时间来改变它的章程)。所以,不,不能在 JBoss 上为应用程序提供私有库。

我是注释人员的 JPA,而不是休眠 XML 人员。所以我不会将 DTO 和映射更改为使用休眠 XML。不得不从 Hibernate 3.6 退回到 Hibernate 3.2.1 对我来说已经太多了。我有休眠自动检测我的实体类,我不会改变它。

问题

我在 JBoss 4.2.3 开发环境中编写了一个与 JPA 和 JAX-RS 完美运行的 web 应用程序。现在我必须将它放入 Spring 2.5.6 框架中。

所以,我创建了以下ApplicationContext.xml ...

<bean id="propertyPlaceHolder" class="zzz.common.spring.config.ConfigPlaceholderConfigurer" >
    <property name="location" value="file:C:/config/bootstrap.properties"/>
</bean>

<tx:annotation-driven />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
  <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> 
  <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" >
  <property name="persistenceUnitName" value="obamacare"/>    
</bean>

~

这就是persistence.xml。最初,属性值是在开发期间硬编码的。但是要将它们转化为生产,必须将它们的值转换为 spring ${references}。${references} 是从文件:C:/config/bootstrap.properties 中读取的,zzz.common.spring.config.ConfigPlaceholderConfigurer 需要通过身份验证服务设置用户和密码。

<persistence-unit name="obamacare" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <!-- Scan for annotated classes and Hibernate mapping XML files -->
    <properties>
        <property name="hibernate.archive.autodetection" value="class, hbm" />

        <property name="hibernate.connection.driver_class"
            value="${zzz.common.sql.ConnectionPool.driverClass}" />
        <property name="hibernate.connection.url"
            value="${zzz.common.sql.ConnectionPool.url}" />

        <property name="hibernate.connection.username" value="${zzz.common.sql.ConnectionPool.user}"/>
        <property name="hibernate.connection.password" value="${zzz.common.sql.ConnectionPool.password}"/>

        <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
        <property name="hibernate.show_sql" value="true" />

    </properties>
</persistence-unit>

很明显,持久化XML中的spring ${references}是不行的,因为实体管理器为Null,因为jdbc驱动类为null。以及 url 和用户名和密码。

我将以下几行放入 JAX-RS 响应代码中,其中调试器显示 entityManager 为空。

@PersistenceContext
private EntityManager entityManager;

问题

Q1。

我需要做些什么才能使 spring ${references} 注入到我的 persistence.xml 属性中?

Q2。

我试图将 persisitence.xml 属性传输到 ApplicationContext.xml 中的数据源中。

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" >
    <property name="persistenceUnitName" value="unit1"/>    
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="${zzz.common.sql.ConnectionPool.driverClass}"/>
    <property name="url" value="${zzz.common.sql.ConnectionPool.url}"/>
    <property name="username" value="${zzz.common.sql.ConnectionPool.user}"/>
    <property name="password" value="${zzz.common.sql.ConnectionPool.password}"/>
</bean>

但是 JBoss 启动失败,因为... DriverManagerDataSource 不可写,没有 setDatasource 方法或 setDatasource 方法不可访问,等等,等等。

为什么在 DriverManagerDataSource 中不能设置数据源?我需要在扩展类中做什么来创建 setDatasource 方法。在该方法中我需要做什么?

您能否建议一个允许 setDatasource 的替代 jdbc 数据源?

Q3。

还有什么我需要做的,或者spring框架会自动在实体管理器中找到PersistenceContext注释,然后尝试实例化它?

Q4。

bean jpaTemplate 有什么作用?为什么我需要它?

Q5。

如果我将所有内容都转移到 ApplicationContext.xml,我还需要保留一个虚拟的占位符 persistence.xml 吗?

我需要帮助。通过使 DriverManagerDataSource 在 ApplicationContext.xml 中工作或使 ${references} 在 persistence.xml 中工作。

谢谢你们。

这是我上周提出的问题的后续:动态设置 JPA 持久性属性

4

2 回答 2

2

Q4 JpaTemplate 不再是必需的。它被贬低了。

Q5 如果你只有一个持久化单元,那么Spring就不需要persistence.xml。您可以使用 LCEMFB 属性“packagesToScan”并引用实体包目录。

注意:不要使用“PersistenceUnit”属性,它会覆盖“PackagesToScan”

我在这里写过关于 Spring Data JPA 的博客

于 2012-08-19T22:41:22.823 回答
1

第一季度

你不能 AFAIK,Spring 只会将占位符配置加载到它自己管理的 xml 文件中

Q2、Q3、Q5

这篇博文讨论了使用LocalContainerEntityManagerFactoryBean来取消 persistence.xml

第四季度

这篇文章谈到不想使用 JpaTemplate但仍然获得 Spring 的 Exception 翻译等优点。

于 2012-08-16T08:43:14.853 回答