我有一个数据库代码jar,我在不同的应用程序中使用它来访问数据库。我正在使用spring data jpa
。我需要调用刷新来检查来自其他应用程序的数据库中的行的更改。下面是我如何实现它。我的StudentRepository
接口:
public interface StudentRepository extends JpaRepository<StudentEntity, Integer>, StudentRepositoryCustom {}
我的StudentRespositoryCustom
接口
public interface StudentRepositoryCustom {
void detach(StudentEntity studentEntity);
void refresh(StudentEntity studentEntity);}
我的StudentRepositoryCustomImpl
类
public class StudentRepositoryImpl implements StudentRepositoryCustom {
@PersistenceContext
EntityManager entityManager;
@Override
@Transactional
public void detach(StudentEntity studentEntity) {
entityManager.detach(studentEntity);
}
@Override
@Transactional
public void refresh(StudentEntity studentEntity) {
entityManager.refresh(studentEntity);
}}
我的测试
@Test
public void refreshTest(){
StudentEntity studentEntity = studentRepository.findOne(6);
studentRepository.refresh(studentEntity);
}
但它会掷回这个例外状况:
org.springframework.dao.InvalidDataAccessApiUsageException: Entity not managed; nested exception is java.lang.IllegalArgumentException: Entity not managed
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:384)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:492)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
此行在hibernate-core-5.2.1.final
类SessionImpl
类返回空
EntityEntry entry = persistenceContext.getEntry( object );
我想它应该返回实体。
我的persistence.xml
文件是
<persistence-unit name="testPersitanceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.sample.dao.gen.StudentEntity</class>
<properties>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="update"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.enable_lazy_load_no_trans" value="true" />
</properties>
</persistence-unit>
我的spring db配置文件是
<jpa:repositories base-package="com.sample.dao.repos"
entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>
<!-- Enable the component scan (auto wiring etc) for the following package -->
<context:component-scan base-package="com.sample.dao" />
<!-- Make sure the following is specified to enable transaction -->
<tx:annotation-driven />
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- This defines the entity manager factory with some custom properties -->
<bean id='entityManagerFactory' primary="true" class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'>
<property name="persistenceUnitName" value="testPersitanceUnit"/>
<property name='dataSource' ref='dataSource' />
<property name="packagesToScan" value="com.sample.dao" />
enter code here
4条答案
按热度按时间vxf3dgd41#
尝试
出现此问题的原因是,在测试中,studentEntity在事务(findOne)外部传递,因此不再受管理。当它传递到新事务(refresh)时,它不再受管理,因此引发此错误。
或者,如果最初的刷新是所需的行为,您可以将整个测试 Package 在一个事务中,这将维护测试对象的管理。
oprakyz72#
刷新前请尝试使用合并。
xzv2uavs3#
我用不同方法解决了同一问题
最初我的代码是这样的
看来是对的。
但问题是saveAndFlush(()返回的更新实体,我们应该刷新更新的实体。
更新saveAndFlush()返回的“myEntity”后,错误已修复
8oomwypt4#
实际上这是一个查询问题。查询生成内部连接,因此返回空列表,因此抛出异常。我更改了Map,使其可以生成外部连接,然后返回一行,并且成功。