Spring + Spring Data JPA 配置

3

目前我正在研究一个Spring设置。我的目标是使用JPA来访问Websphere数据源,使用它的JNDI名称。我正在使用Spring Data JPA来使我的生活更容易,并通过一些教程来了解基本思想。

不好的事情是:没有一个教程谈论我的JPA场景的Spring配置+我以前从未使用过JPA / JDBC。所以我希望你能在这里帮助我。我有两个配置文件:

applicationContext.xml

<bean id="txManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />

<bean id="eManager" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"></bean>

由于我在代码中使用了@Transactual注释,因此我正在使用annotation-driven标记来处理txManager。但我不是很确定还需要为txManager配置什么以及sessionFactory标记的作用。是否有所有支持的XML标签的文档?我是否漏掉了我的场景中重要的标记?

eManager也是一样-不确定任何方面是否正确。

persistence.xml

<persistence version="1.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_1_0.xsd">
    <persistence-unit name="spring-jpa">
        <jta-data-source>jdbc/myJNDI</jta-data-source>
    </persistence-unit>
</persistence>

同样的问题:我不知道自己在做什么。我知道我需要一个持久化单元/提供者。我知道很多人使用hibernate,但如果可能的话,我想保持原生的JavaEE / Spring。只是不确定如何配置。 目前我的项目崩溃了,告诉我:“JPA PersistenceProvider返回null”

3个回答

4
最佳方式是通过Spring的JNDI支持从JNDI中获取EntityManagerFactory:
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/myPersistenceUnit" />

<jpa:repositories base-package="com.acme.repositories" />

<tx:jta-transactionManager />

这将导致应用程序服务器使用事务管理器。您也可以尝试设置一个 JpaTransactionManager,并将从 JNDI 获取到的 EntityManagerFactory 联接到它。如果您仅通过 <jee:jndi-lookup /> 命名空间元素查找数据源并遵循 Spring Data JPA 参考文档中的进一步配置说明,则可以将更多配置项放入 Spring 配置文件中。然而,如果决定使用容器资源,最好使用实际可获取的容器资源。

但是我怎么知道entityManagerFactory的jndi名称?Persistence-Unit名称元素在persistence.xml中是否与此有关?我不明白这里实际上正在发生什么。应用程序向服务器进行jndi查找,请求具有jndi名称“persistence/myP...”的资源-它如何知道它是EntityManager?这与persistence.xml配置有什么关联? - omni
现在我已经配置了服务器(WebSphere)以使用openJPA作为默认持久性提供程序。文档说,如果persistence.xml中的<provider>元素为空,则WebSphere将使用默认持久性提供程序。但是似乎没有办法为默认提供程序配置JNDI名称,那么应该为entityManagerFactory输入什么JNDI名称?第二个问题:我现在遇到了一个缺少ExceptionTranslator错误。我查找了一下,似乎我应该为它声明一个实现JPADialect的bean。然而:似乎Spring没有OpenJPA类可以用于此。怎么办? - omni
这个问题在WebSphere的世界中一定有文档记录,很抱歉我无法提供更多帮助…… - Oliver Drotbohm
嗯,我想我得摸索一下。无论如何,谢谢你的帮助,它为我节省了很多尝试和错误。 - omni
嗯,但是为了确保:PersistenceProvider JNDI 不是 DataSource JNDI,对吧? - omni
显示剩余2条评论

3

我刚开始使用Spring,jpa mysql等技术... 如果需要帮助,也许我能帮上忙。

顺便提一下,我使用的是Hibernate连接数据库,没有使用其他方式,所以这方面的问题我就帮不上忙了 :)

我的配置如下:

Spring-config.xml:

<context:component-scan base-package="com.MYPACKAGE"/> 
<!-- To find all your controllers -->

<tx:annotation-driven/> 
<!-- This will pickup all your @Transactional annotations-->

<import resource="../database/DataSource.xml"/>
<import resource="../database/Hibernate.xml"/>
<!-- These are my database config files-->

Datasource.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/DATABASENAME"/>
    <property name="username" value="USERNAME"/>
    <property name="password" value="PASSWORD"/>
</bean>

Hibernate.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
        </bean>
    </property>
</bean>

我没有包括你需要在.xml文件顶部包含的标准xml文本,但我相信你自己可以解决这个问题 ;)
这个设置对我很有效,希望它能对你有所帮助!如果您对此帖子有任何疑问,请让我知道!
祝好运!

1
谢谢你的回答。不幸的是,你描述的是一个JDBC + Hibernate的设置,与我尝试做的事情有很大的不同。但至少你的回答告诉我tx:annotation-driven应该足够满足我的需求,所以非常感谢! - omni

2

对于使用JBoss的用户,可以在persistence.xml属性中设置jndi名称,如下所示:

    <persistence-unit name="punit" transaction-type="JTA">

      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/myDS/jta-data-source>

      <class>com.company.model.Document</class>
      <class>com.company.model.DocumentIndividual</class>

      <properties>
        <property name="hibernate.hbm2ddl.auto" value="create" />
        <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> -->
        <property name="javax.persistence.logging.level" value="INFO" />
        <property name="hibernate.show_sql" value="true" />
        <property name="jboss.entity.manager.jndi.name" value="java:/my_em"/>
        <property name="jboss.entity.manager.factory.jndi.name" value="java:/my_emf"/>
    </properties>

</persistence-unit>

此处4.4.2节所述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接