(PersistentObjectException:分离的实体传递给持久化)在获取数据时

时间:2020-08-04 21:03:48

标签: java spring hibernate spring-data-jpa spring-data

我有对象A,其中有一组对象B

@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL,
           fetch = FetchType.LAZY,
           mappedBy = "a")
private Set<B> b = new HashSet<>();

和对象B

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id", nullable = false)
@JsonBackReference
private A a;

我知道以某种方式我们会遇到双向一致性问题,同时会出现“持续” 数据错误的注释...

我在这里保存没有问题:

  • 创建对象A
  • 创建对象B
  • 将A添加到B
  • 将B作为列表添加到A
  • 保存A

我有一个对象B的DAO类,该类扩展了JpaRepository,即使我忘记了自定义方法并从findALl调用org.springframework.data.jpa.repository.JpaRepository

我得到这个例外!

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.myproject.model.B; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.myproject.model.B
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:280)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke

为什么在获取数据时会发生这种情况?

我的单元测试方法:

@Test
void test(){
    A a = new A();
    B b = new B();
    b.setA(a);
    a.setB(Collections.singleton(b));
    
    aDao.save(a); //works fine
    
    specificService();
}

和我的服务方式: 致电bDao.findAll()

时发生异常的地方
@Transactional(rollbackFor = Exception.class)
@Override
public void specificService(){
    A a = aDao.findAll(); //works fine I can see b in a
    B b = bDao.findAll(); //PersistentObjectException
}

我的配置测试中有这个...

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

0 个答案:

没有答案