【问题标题】:Spring + Spring Data JPA ConfigurationSpring + Spring Data JPA 配置
【发布时间】:2012-05-10 15:52:54
【问题描述】:

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

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

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 注释,因此我正在为 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>

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

【问题讨论】:

    标签: spring jakarta-ee persistence spring-data spring-data-jpa


    【解决方案1】:

    最好的方法是通过 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 连接到其中。如果仅通过 &lt;jee:jndi-lookup /&gt; 命名空间元素查找数据源并遵循 Spring Data JPA 参考文档中的进一步配置说明,则可以将更多配置拉入 Spring 配置文件。不过,如果您决定完全使用容器资源,通常最好使用您实际可以获得的容器资源。

    【讨论】:

    • 但是我怎么知道 entityManagerFactory 的 jndi 名称? persistence.xml 中的 Persistence-Unit 名称元素是否以某种方式与此相关联?我不明白这里实际发生了什么。应用程序对服务器进行 jndi-lookup,请求 jndi 名称为“persistence/myP..”的资源 - 它如何知道它是 EntityManager?这如何链接到 persistence.xml 配置?
    • 你配置的是DataSource的JNDI名称。这些名称取决于您使用的应用程序服务器,因此您需要在您的 AS 配置/文档中查找它。 repositories 元素期望找到一个名为 entityManagerFactory 的 bean,您可以通过 jndi-lookup 元素查找它。有关jee 命名空间的更详细文档,请查看reference documentation
    • 现在我将服务器 (WebSphere) 配置为使用 openJPA 作为默认持久性提供程序。如果 persistence.xml 中的 元素为空白,则 sais websphere 文档将使用默认持久性提供程序。但似乎无法为默认提供程序配置 JNDI 名称,所以我应该为 jndi-name 输入什么eneityManagerFactory 的?第二个问题:我现在收到一个缺少的 ExceptionTranslator 错误。我查了一下,似乎我应该为它声明一个实现 JPADialect 的 bean。但是:似乎 spring 没有 OpenJPA 类。怎么办?
    • 退出第二个问题,我刚刚找到 org.springframework.orm.jpa.DefaultJpaDialect 并且错误消失了。仍然:我收到错误,因为我无法向默认提供程序提供 JNDI 名称。
    • 它必须记录在 WebSphere 世界的某个地方,很抱歉,我无法为您提供更多帮助……
    【解决方案2】:

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

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

    我的配置:

    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-->
    

    数据源.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 文本,但我相信您自己会解决这个问题;)

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

    祝你好运!

    【讨论】:

    • 感谢您的回答。不幸的是,您描述的 JDBC + Hibernate 设置与我尝试做的有很大不同。但至少你的回答告诉我 tx:annotation-driven 应该足以满足我的设置,所以谢谢!
    【解决方案3】:

    对于那些使用 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>
    

    here 4.4.2 节所述

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 2014-09-22
      • 2017-07-17
      • 1970-01-01
      • 2015-06-16
      • 2016-11-07
      相关资源
      最近更新 更多