当前位置: 首页 > 知识库问答 >
问题:

与Spring和JPA的交易

颜志业
2023-03-14

我正在学习使用JPA。我有点困惑。

根据JPA,EntityManager管理事务。但是一种设计模式是将EntityManager注入DAO中。那么不同的实体管理器怎么可能是同一个事务呢?

这是我要解决的案子

我定义了 DAO

@Repository
JPARepository1 {

    @PersistenceContext
    protected EntityManager em;

    ....   

.

@Repository
JPARepository2 {

    @PersistenceContext
    protected EntityManager em;

    ....

我有一个服务。

@Service
public class ServiceImpl1 {

    @Autowired
    private JPARepository1 repo1;

    @Autowired
    private JPARepository2 repo2;  


    public void mainMethod(){
        Object o= transactionalMethod1();

        try{
            transactionalMethod2(o);
        }catch (Exception e){
            transactionalMethod3(o);
        }

    }

    private Object transactionalMethod1(){
        ....
    }

    private void transactionalMethod2(Object o){
        ....
    }


    private void transactionalMethod3(Object o){
        ....
    }

然后从@Controller,我将调用main Method()。在同一个服务中并使用同一个存储库中,对transactionalMED1、transactionalMED2和transactionalMED3进行事务性处理的正确方法是什么?我希望如果transactionalMED2中有exeption,这会中止事务,但保留transactionalMED1和transactionalMED3的事务。谢谢,对不起,我的英语。

共有1个答案

黎奇思
2023-03-14

通常,您配置一个实体管理器,因此有线管理器始终是相同的,即您配置的管理器。但是,此管理器的实例在每次布线中都是不同的。

因此,服务中的每个事务都使用EntityManager的不同实例,因此调用的每个事务都是相互分离的。

因此,< code > transactional method 2 中的异常不一定会影响< code > transactional method 1 和< code > transactional method 3

在同一服务内并使用同一存储库的情况下,对transactionalMethod1、transactionaryMethod2和transactional Method3进行事务处理的正确方式是什么。

现在,您有两个选项来执行服务方法事务

1) 您可以这样注释整个@Service

@Service
@Transactional
public class ServiceImpl1 {
....

所以这里声明的每个方法也是一个事务。

2)您可以将每个方法注释为@Transactional

@Transactional
private Object transactionalMethod1(){
    ....
}

@Transactional
private void transactionalMethod2(Object o){
    ....
}

@Transactional
private void transactionalMethod3(Object o){
    ....
}

如果要使用单个存储库,只需@Autowired单个存储库并在@Transactionalmethod中使用。例如:

@Service
@Transactional
public class ServiceImpl1 {

@Autowired
private JPARepository1 repo1; 

public void mainMethod(){
    Object o= transactionalMethod1();

    try{
        transactionalMethod2(o);
    }catch (Exception e){
        transactionalMethod3(o);
    }

}

private Object transactionalMethod1(){
    return repo1.findOne();
}

private void transactionalMethod2(Object o){
    repo1.create(o);
}


private void transactionalMethod3(Object o){
    repo1.delete(o)
}
 类似资料:
  • 我使用的是Querydsl 2.9、Spring Data JPA 1.3.0和Hibernate JPA 2 API 1.0版。我试图在两个表和之间进行简单的连接,连接到列。由于某些原因,Hibernate执行的查询中总是有一个额外的。这些表格如下所示: 但是,实际运行的查询是这样的: 请注意结尾处额外的。我意识到,如果在上执行可以得到正确的结果,但我不希望在不需要的情况下增加的额外开销。我尝试

  • 我还没有找到在QueryDSL中声明这种SQL的任何方法。我能够编写两个select语句,但是我仍然无法将它们与结合起来。 最后,我想检索一个与给定查询匹配的ID列表。通常,相交的数量可以是20或30左右,这取决于我要搜索的键/值对的数量。 有没有人知道如何使用QueryDSL执行类似的操作?

  • 问题内容: 在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?还是我们都应该称呼它们?有什么区别?因为我在使用JPA时遇到问题,所以当我向数据库中插入实体时,我会调用persist()。在数据库中,数据已插入(可以获取),但是该数据未显示在我的应用程序中(我使用findAll()进行获取)。在另一个实体上,它出现

  • 在JPA中,如果我们调用EntityTransaction。commit(),它是否自动调用EntityManager。flush()?或者我们应该叫他们两个?有什么区别?因为我对JPA有问题,当我向数据库插入实体时,我调用persist()。在数据库中,数据已经插入(可以提取),但该数据没有显示在我的应用程序中(我使用findAll()提取)。在另一个实体上,它出现了。有什么我不知道的吗?我使用

  • 我正在将Spring Boot项目与Spring批处理和数据jpa项目集成。所有与作业和数据配置相关的东西都是正确的,除了将我的作业编写器结果保存在数据库中。在我读取文件并对其进行处理后,我无法将其写入mysql数据库。没有错误,但也没有插入。有趣的是我的数据源已配置。因为在插入之前,我可以从数据库中获取示例记录。请协助我解决这个问题。 我的申请。属性: 批次配置: 道类: 作家类: temPer

  • 问题内容: 对于新项目,JPA始终是推荐的用于处理关系数据的工具吗?或者在某些情况下,Spring JdbcTemplate是更好的选择?您的回应中应考虑以下因素: 新数据库架构与现有架构和表 开发人员专业知识水平 易于与数据缓存层集成 性能 还有其他需要考虑的因素吗? 问题答案: 如果您不想通过域模型访问数据库架构,请使用Spring JdbcTemplate。使用JdbcTemplate,您将