我有对象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;
我知道以某种方式我们会遇到双向一致性问题,同时会出现“持续” 数据错误的注释...
我在这里保存没有问题:
我有一个对象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