如何在调用存储过程之前刷新Spring Data JPA?

时间:2018-12-18 19:27:01

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

因此,我有一个JPA实体(比如说Foo),其中的FooRepository被定义为CrudRepository<Foo, Long>的扩展。存储库很少有自定义方法,其中有一个方法(比方说initFoo)映射到带有@Procedure批注的存储过程。现在在服务层中,有一种方法看起来很像这样(过度简化):

Foo f = new Foo();
f.setId(5)
f.setName("Bar");
FooRepository.save(f);
FooRepository.initFoo(f.getId());

调用此方法将导致存储过程出错。经过仔细检查(违反约束:键foo_id=5不存在),它显示Foo完成后,实体FooRepository.save()并没有最终出现在数据库中。实体管理器很可能决定不着急,并将实体保留在内存/缓存中。

问题是:如何说服EM将特定实体刷新到db?我想避免在服务层连接EntityManager并直接调用flush()。我尝试使用@Modifying注释存储过程方法,但看来它仅适用于@Query方法。有什么明智的方法可以解决此问题?

Spring Boot(带有spring-boot-starter-data-jpa)1.3.3发布

1 个答案:

答案 0 :(得分:1)

您可以使用包含方法override func setupNavigationBar() { navigationItem.title = .none if #available(iOS 11.0, *) { navigationController?.navigationBar.prefersLargeTitles = true let titleLabel = UILabel() titleLabel.text = "Home" titleLabel.translatesAutoresizingMaskIntoConstraints = false let targetView = self.navigationController?.navigationBar targetView?.addSubview(titleLabel) titleLabel.anchor(top: nil, left: nil, bottom: targetView?.bottomAnchor, right: nil, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 222, height: 40) titleLabel.centerXAnchor.constraint(equalTo: (targetView?.centerXAnchor)!).isActive = true } else { // Fallback on earlier versions } } 的{​​{1}}来代替CrudRepsitory