Spring Data Jpa 在同一事务中使用同一数据库的不同表的规范方法是什么?

7dl7o3gd  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(100)

为了访问同一个数据库中的两个不同的表,我使用了两个专用的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注解,这需要它。
有没有什么方法可以进行重构?

pgky5nke

pgky5nke1#

这两个方法似乎都需要@ translation来避免警告。你应该看看这个。
仍然给我们留下了一个只为JPA机制公开的纯内部方法(persist)。

相关问题