基础
我正在使用 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 持久性属性。