为了访问同一个数据库中的两个不同的表,我使用了两个专用的CrudRepositories:
public interface ProjectRepository extends CrudRepository<Project, String> {
public Project findByCode(ProjectCode code);
}
public interface ProjectEventRepository extends CrudRepository<ProjectEventDo, String> {}
在我的服务类中,我需要在同一个事务中向它们两者写入:
@Transactional
public void deleteProject( String code) throws NoSuchCodedItemException {
ProjectCode pCode= new ProjectCode(code);
Project project = this.projectRepo.findByCode(pCode);
if( project != null ) {
this.projectRepo.save(project);
project.getEvents().forEach(event -> {
this.eventRepo.save(ProjectEventDo.of(event));
});
}
throw new NoSuchCodedItemException(code);
}
相反,我想做的是将其分解为服务类的一个公共方法,如下所示:
@Transactional
public void persist(Project project) {
this.projectRepo.save(project);
project.getEvents().forEach(event -> {
this.eventRepo.save(ProjectEventDo.of(event));
});
}
public void deleteProject( String code) throws NoSuchCodedItemException {
ProjectCode pCode= new ProjectCode(code);
Project project = this.projectRepo.findByCode(pCode);
if( project != null ) {
this.persist(project);
}
throw new NoSuchCodedItemException(code);
}
这是沿着这条线的答案相同的问题。然而,它发出了这样的警告:
@Transactional self-invocation (in effect, a method within the target object calling
another method of the target object) does not lead to an actual transaction at runtime
在this accepted answer中,重点是避免自调用公共方法,实际上,它是公共的,只是为了取悦@ translation注解,这需要它。
有没有什么方法可以进行重构?
1条答案
按热度按时间pgky5nke1#
这两个方法似乎都需要@ translation来避免警告。你应该看看这个。
仍然给我们留下了一个只为JPA机制公开的纯内部方法(
persist
)。