IntegrityException的spring eclipselink问题

Posted

技术标签:

【中文标题】IntegrityException的spring eclipselink问题【英文标题】:spring eclipselink problem with IntegrityException 【发布时间】:2011-06-08 22:21:34 【问题描述】:

我尝试将 spring 与 eclipseLink 一起使用,但出现了 IntegrityException。 这是我的配置:

<?xml version="1.0" encoding="UTF-8"?>

xsi:schemaLocation="http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<import resource="data-source.xml" />

<tx:annotation-driven mode="proxy"
    transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory" />

<!-- Entity manager -->
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="unit1" />
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver"/>
    </property>
    <property name="jpaVendorAdapter">
        <bean
            class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
            <property name="databasePlatform" value="org.eclipse.persistence.platform.database.DerbyPlatform" />
            <property name="showSql" value="true" />
            <property name="generateDdl" value="true" />
        </bean>
        <!-- <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> -->
        <!-- <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect" 
            /> -->
        <!-- <property name="showSql" value="true" /> -->
        <!-- <property name="generateDdl" value="true" /> -->
        <!-- </bean> -->
    </property>
</bean>

<bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

确切的例外是:

[EL 配置]: 2011-06-09 00:15:24.061--ServerSession(2050312009)--Connection(473155160)--Thread(Thread[main,5,main])--Connected: jdbc:derby ://localhost:1527/springhib;create=true 用户:应用 数据库:Apache Derby 版本:10.6.2.1 - (999685) 驱动程序:Apache Derby 网络客户端 JDBC 驱动程序版本:10.7.1.1 - (1040133) [EL 严重]:2011-06-09 00:15:24.127--ServerSession(2050312009)--Thread(Thread[main,5,main])--本地异常堆栈: 异常 [EclipseLink-0] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.IntegrityException 描述符异常:

异常 [EclipseLink-148] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException 异常描述:容器策略 [CollectionContainerPolicy(class org.eclipse.persistence.indirection.IndirectSet)] 与透明间接不兼容。 映射:org.eclipse.persistence.mappings.ManyToManyMapping[cmets] 描述符:RelationalDescriptor(pl.adaknet.hibspring.domain.ArtEntity --> [DatabaseTable(ARTENTITY)])

但是当我使用另一个供应商时我没有这个问题

org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter

有什么想法吗?

【问题讨论】:

【参考方案1】:

尝试使用这个 loadtimeweaver 实现:

package net.palesz.util;

import org.springframework.instrument.classloading.SimpleLoadTimeWeaver;

public class JpaAwareLoadTimeWeaver extends SimpleLoadTimeWeaver 
    @Override
    public ClassLoader getInstrumentableClassLoader() 
        ClassLoader instrumentableClassLoader = super.getInstrumentableClassLoader();
        if (instrumentableClassLoader.getClass().getName().endsWith("SimpleInstrumentableClassLoader")) 
            return instrumentableClassLoader.getParent();
         else 
            return instrumentableClassLoader;
        
    

Spring context.xml 配置:

<bean id="loadTimeWeaver" class="net.palesz.util.JpaAwareLoadTimeWeaver" />

【讨论】:

我在使用 SimpleLoadTimeWeaver 时遇到了同样的问题,并且想报告上面的类确实适用于 EclipseLink。谢谢帕莱斯。【参考方案2】:

一个奇怪的错误,因为 IndirectSet 是有效的。这似乎是一个类加载器的问题,但我之前在 Spring 中没有见过这个。

这可能与您对 loadTimeWeaver 的使用有关,因此您可以尝试将其删除。

你在什么环境下运行 Spring?

【讨论】:

【参考方案3】:

你必须使用代理进行动态编织 -javaagent:spring-agent-2.5.6.jar 我试过eclipseLink代理,但没有用。

有关 Spring 为 JPA 编织的更多信息:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch14s06.html 如果您想在 tomcat 上运行您的代码:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch14s06.html#orm-jpa-setup-lcemfb-tomcat

【讨论】:

请在您的回答中添加一些其他信息

以上是关于IntegrityException的spring eclipselink问题的主要内容,如果未能解决你的问题,请参考以下文章

你了解Spring从Spring3到Spring5的变迁吗?

学习笔记——Spring简介;Spring搭建步骤;Spring的特性;Spring中getBean三种方式;Spring中的标签

Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC

Spring--Spring入门

Spring:Spring介绍

Spring浅析Spring框架的搭建