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

服务层和DAO层中的Spring事务

公西兴业
2023-03-14

在我的示例中,我有一个Hibernate实体和一个DAO。

@Entity
@Table(name="myEntity")
public class MyEntity {

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private long id;

    @Column(name="action")
    private String actionName;

}

...................

@Repository("myDAO")
@Transactional(propagation = Propagation.REQUIRED)
public class MyDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public void saveObject(MyEntity myEntity){
        sessionFactory.getCurrentSession().save(myEntity);
    }

}

当我以这种方式使用DAO时

@Service("myService")
@Transactional(propagation = Propagation.REQUIRED)
public class MyService 
{

    @Autowired
    private MyDAO myDAO;

    public void executeTransaction(){
        MyEntity myEntity = new MyEntity();

        myEntity.setActionName("Action1");
        myDAO.saveObject(myEntity);

//      myEntity = new MyEntity();
        myEntity.setActionName("Action2");
        myDAO.saveObject(myEntity);
    }

}

数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

共有2个答案

卢书
2023-03-14

只有在存储两个不同的对象时,两个不同的记录才会保存在数据库中。当您对该行进行注释时,您正在同一对象中设置(意味着更新)属性。因此,hibernate将更新同一行,而不是创建一个新行。但是,当您取消注释该行时,您正在创建一个尚未持久化的新实例。因此,它将导致在数据库中插入新行。

逄俊力
2023-03-14

myEntity=new myEntity() 数据库中的记录被更新,而不是插入,因为它是同一个实体。我建议设置<代码>

 类似资料:
  • 我过去认为,在分层应用程序(控制器或服务)中,将验证逻辑放在何处并不重要,但最近正在开发需要事务的服务(使用spring)。Spring使用方面创建代理,Spring代码如下所示: org.springframework.transaction.interceptor.事务支持 所以从我这里看到的,spring首先打开事务,然后执行代码。考虑到验证可能会失败,并且根本不需要DB调用,这是否意味着将

  • 问题内容: 我目前正在使用带有Spring插件和hibernate的Struts2开发一个Web应用程序,并且在查看在线示例时,我看到了Service和DAO层的使用,现在才知道Service和数据访问对象层的真正用途是什么?如果服务层只是在调用DAO层的方法来执行CRUD操作。直接调用DAO层方法不明智吗? 假设此示例为Dao和Service Layer 人员服务 人道 我的问题是,如果仅将服务

  • 问题内容: 我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。我对DAO和Service层之间的区别还不清楚。根据维基百科,DAO是 一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供某些特定的操作而不公开数据库的详细信息。 我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列

  • 问题内容: 如果我的Dao层抛出了Dao特定的异常,那么在我的服务层中对它们的处理是否会引起关注的泄漏?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法吗? 相同的问题适用于服务层引发的UI层处理异常。 问题答案: 当我们创建一个分层的应用程序时,总是有一个用户层和另一个使用过的层。对于这种情况,UI层->使用服务层->使用DAO层。 现在,它非常主观并且易于解释。但目标应该是

  • 假设我有类和。 班级帐户 班级付款 DAO层有实现CRUD方法的和类。下一个是服务层,它有和类,它们在DAO类之上执行其他操作。 因为我使用的是货币/货币,所以我使用的是交易。我在我的DAO课程中使用它们。 我的类有一个方法,该方法为每个特定的DaoFactory(例如)返回一个连接对象,该对象使用 中实现这个场景时,它是实现事务的正确方式吗?

  • 我正在使用当前层拓扑: 1)道2)服务3)控制器(演示) 在我的一个控制器中,我收到以下呼叫(来自客户端): 控制器现在应该将调用委托给服务层。 问题是,如果我创建一个如下方法: 在我的服务中,我实际上让我的服务层意识到DTO对象! 我认为这是一种不好的做法(或者不是?) 因此,我提出的另一个选择是创建一个新类: 然后调用我的控制器: 这个解决方案的问题是我在我的项目中根本没有使用这个类,所以它看