Java 让JPA在JBoss服务器上与Spring框架一起工作

Java 让JPA在JBoss服务器上与Spring框架一起工作,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,基础 我使用的是Spring 2.5.6和Hibernate 3.2.1,因为我必须部署到jboss 4.2.3,它的设置是不允许被干扰的(因为jboss服务器是由一个脚本构建的,脚本很旧,但没有授权花时间修改它)。因此,不能在JBoss上为应用程序设置私有库 我是JPA注释人员,而不是HibernateXML人员。因此,我不会将DTO和映射更改为使用HibernateXML。必须从Hibernate3.6回归到Hibernate3.2.1对我来说已经太难了。我有hibernate自动检测我的实

基础


我使用的是Spring 2.5.6和Hibernate 3.2.1,因为我必须部署到jboss 4.2.3,它的设置是不允许被干扰的(因为jboss服务器是由一个脚本构建的,脚本很旧,但没有授权花时间修改它)。因此,不能在JBoss上为应用程序设置私有库

我是JPA注释人员,而不是HibernateXML人员。因此,我不会将DTO和映射更改为使用HibernateXML。必须从Hibernate3.6回归到Hibernate3.2.1对我来说已经太难了。我有hibernate自动检测我的实体类,我不会改变它

问题

我在JBoss4.2.3 dev env中编写了一个webapp,它与JPA和JAX-RS一起出色地运行。现在我必须将它安装到Spring2.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>
问题

Q1.

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

Q2.

我尝试将perssitence.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启动失败,因为。。。DriverManager数据源不可写,没有setDatasource方法或setDatasource方法不可访问,等等

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

您能推荐一个允许setDatasource的替代jdbc数据源吗

Q3.

我还需要做什么,或者spring framework会自动在entitymanager中找到PersistenceContext注释,然后尝试实例化它吗

Q4.

bean jpaTemplate做什么?为什么我需要它

Q5.

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

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

谢谢大家

这是我上周问的问题的后续内容:。

Q1

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

Q2、Q3、Q5

本文讨论了如何使用来消除persistence.xml

Q4

这篇文章讨论了但仍然得到了春季例外翻译的好处,等等。

Q4 JpaTemplate不再是真正必要的了。它是不相关的

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

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


“没有特许权来投资时间改变它”-这是你的问题。找一份章程。章程必须从世界各地250家机构收集。不仅仅是我的老板或他的老板。好吧,这家伙说我们不应该在webapps中使用PersistenceContext,因为它不是线程安全的:@BlessedGeek你可以对几乎任何其他对象说同样的话-servlet应该是无状态的,向它添加一个实例,违反了这条法律,除非你保护了那个对象,否则会破坏线程安全。所以persistence.xml中的persistenceUnit就是我的包没有在JBoss上被扫描的原因?但是,为什么它无论如何都能在Tomcat上工作呢?
@PersistenceContext
private EntityManager entityManager;
<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>