3

目前我正在玩 Spring 设置。我的目标是使用 JPA 访问使用其 JNDI 名称的 Websphere 数据源。我正在使用 Spring Data JPA 让我的生活更轻松,并通过一些教程来了解基本概念。

坏事:这些都不是在谈论我的 JPA 场景的 Spring 配置 + 我以前从未使用过 JPA / JDBC。所以我希望你能在这里帮助我。我有2个配置文件:

应用程序上下文.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 注释,所以我正在为 txManager 使用注释驱动的标签。我只是不确定我应该为 txManager 配置什么以及 sessionFactory 标签在做什么。是否有所有支持的 XML 标签的文档?我是否错过了我的场景的重要标签?

eManager 也一样——不确定这是否正确。

持久性.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>

同样的事情:真的不知道我在做什么。我知道我需要一个持久性单元/提供者。我知道很多人为此使用休眠,但如果可能的话,我想保持原生并使用纯 JavaEE / Spring。我只是不确定如何配置它。目前我的项目正在崩溃,告诉我:“JPA PersistenceProvider 返回 null”

4

3 回答 3

4

最好的方法是EntityManagerFactory通过 Spring 的 JNDI 支持从 JNDI 获取:

<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/myPersistenceUnit" />

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

<tx:jta-transactionManager />

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

于 2012-05-01T17:16:28.520 回答
3

我刚开始使用 Spring、jpa mysql 等......我也许可以帮助你。我将向您展示我正确了解我的配置的方式。

顺便说一句,我正在使用休眠进行数据库连接,我从来没有这样做过,所以没有我的帮助:)

我的配置:

弹簧配置.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-->

数据源.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>

休眠.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 文本,但我相信您自己会解决;)

这个设置对我有用,我希望它可以帮助你!如果您对这篇文章有任何疑问,请告诉我!

祝你好运!

于 2012-05-01T07:46:40.443 回答
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 节所述

于 2014-09-26T01:37:39.940 回答