2013-02-22 169 views
1

最近我发现了Spring Data Jpa。我无法做到的一件事是对Spring的异常层次结构进行适当的异常转换。弹簧数据-jpa和异常处理

根据Spring Data JPA forces CGLib proxying to non repository classes<jpa:repositories />激活了用@Repository注释的Spring bean的持久性异常转换。本文中的参考文档指向spring-data-jpa 1.1.1。

但是,当您查看版本1.3.0的文档时,此段已被删除。另外,我正在用@Repository注释把它放在任何可能的地方,但没有成功。

我的问题是:是否有可能通过最近的spring-data-jpa lib版本1.3.0来实现适当的异常翻译?

好的。我会把这里的一些配置:

... mpersistence.xml的

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

内容

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

我rpository

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

    Setting findByNamee(String name); 
} 

这里findByNamee应该上升一些春季数据库异常作为数据库中的不动产是名称而不是名称。但是,我总是得到

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

虽然与@Repository注释一切配置一般的DAO对象时,按预期工作。

我想用eclipseLink 2.3.2将它部署在Tomcat 6.0上。

+0

这不是很有帮助,但它绝对有可能。我在我的项目中使用1.3.0版本,并且我有一个测试,声明异常转换在我的存储库上工作。拥有''应该足够了。 'JpaRepositoryConfigExtension'注册bean后置处理器('PersistenceExceptionTranslationPostProcessor'),该处理器查找用'@ Repository'注解的bean。 – zagyi 2013-02-22 18:53:31

+0

任何人都可以指出我错过了什么? – user1278890 2013-03-01 13:29:40

回答

0

你要注入的EclipseLink JPA方言的EntityManagerFactory的,因为异常的翻译是在方言。