1

最近、SpringDataJpaが発見されました。私がそれを機能させることができなかった1つのことは、Springの例外階層への適切な例外変換でした。

このSpringDataによると、JPAはCGLibプロキシを非リポジトリクラスに強制<jpa:repositories />し、@Repositoryで注釈が付けられたSpringBeanの永続性例外変換をアクティブにします。この投稿のリファレンスドキュメントは、spring-data-jpa1.1.1を指しています。

ただし、バージョン1.3.0のドキュメントを見ると、この段落は削除されています。また@Repository、可能な限り注釈を付けて重ねていましたが、成功しませんでした。

私の質問は、最近のspring-data-jpa libバージョン1.3.0で適切な例外変換を実現することは可能ですか?

Ok。ここにいくつかの構成を置きます:

..。

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
  <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:pbase"/>
  <property name="user" value="sa"/>
  <property name="password" value="pass"/>
</bean>

<context:annotation-config/>

<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="persistenceUnitName" value="prjPersistenceUnit"></property>
    <property name="persistenceXmlLocation" value="classpath:META-INF/mpersistence.xml"></property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"
              p:showSql="true"/>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="myEmf"/>
</bean>

<tx:annotation-driven/>

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

mpersistence.xmlのコンテンツ

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
    <persistence-unit name="prjPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <description>Persistence unit which uses EclipseLink JPA 2.0 implementation.</description>
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.mycompany.Setting</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.target-server" value="JBoss"/>
            <property name="eclipselink.target-database" value="Oracle10g"/>
            <property name="eclipselink.weaving" value="static"/>
        </properties>
    </persistence-unit>
</persistence>

私のリポジトリ

@Repository
public interface TestRepository extends JpaRepository<Setting, Long> {

    Setting findByNamee(String name);
}

ここで、データベースの実際のプロパティはnameeではなくnameであるため、findByNameeはSpringデータベースの例外を発生させる必要があります。しかし、私はいつも得ます

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException

@Repositoryただし、アノテーションを使用して通常のDaoオブジェクトを構成すると、すべてが期待どおりに機能します。

eclipseLink2.3.2を使用してTomcat6.0にデプロイしようとしています。

4

2 に答える 2

0

例外トランスレータが方言にあるため、EclipseLink Jpa方言をEntityManagerFactoryに注入する必要があります。

于 2013-10-03T20:54:47.943 に答える