我使用spring data / jpa来执行一些数据库操作。我有一个while循环运行并在运行时成功插入数据,但我还需要在每次运行while循环结束时进行更新操作。这基本上就是我在一个简单的例子中所拥有的。这正是我正在使用的结构。
做所有操作的类:
@Component
public class MyClassImpl implements MyClass {
@Autowired
MyOtherClass myOtherClass;
@Override
public void run() {
while (expression) {
// get some data into and entity object
myOtherClass.insertMethod(entity);
myOtherClass.updateMethod(entityId);
}
}
}
我的另一堂课:
@Component
public class MyOtherClassImpl implements MyOtherClass {
@Override
JpaClass jpaClass;
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertMethod(EntityObject entity) {
jpaClass.save(entity);
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateMethod(String entityId) {
EntityObject entity = jpaClass.findById(entityId);
//change something on the entity
jpaClass.save(entity);
}
}
实体对象:
public interface JpaClass extends JpaRepository<EntityObject, Long> {
EntityObject findById(String entityId);
}
我遇到的问题是插件工作得很好,但在while循环中我无法获得任何更新,就像我拥有它们一样。我试过移动逻辑并将findById逻辑放在不同的方法中,但无法使其工作。我试图在表中更新1行,处理1值,然后我需要在下一次运行while循环时引用它。
所以它是:
我使用spring @Configuration在一个适用于所有事务的类上设置数据库配置,以供参考它基本上设置如下:
@Configuration
@EnableTransactionManagement
@PropertySource(value = { "classpath:/${app.execution.environment}/application.properties" })
@EnableJpaRepositories(basePackages = "com.example", entityManagerFactoryRef = "mysqlEntityManager", transactionManagerRef = "mysqlTransactionManager")
public class MysqlHibernateConfig {
// all the needed beans here
}
也是为了确认,我在没有while循环的情况下运行了这个逻辑,并且数据确实按预期更新,所以问题出在数据库事务中的某个地方,但我仍然坚持如何解决它。