【问题标题】:Transaction managment in JSP with Springboot使用 Spring Boot 在 JSP 中进行事务管理
【发布时间】:2018-08-21 18:37:08
【问题描述】:

有没有办法在 Springboot 应用程序中简单地获取分离的实体?

为了说明(我保留严格的最小值):

这里是实体 A 的存储库:

public interface ARepository extends JpaRepository<A, Long> { (...) }

这里是 A 类的对象管理器(执行一些原子操作):

public class AManager {

    private ARepository aRepository;

    @Transactional(readOnly = true)
    public A getA(long id) {
        return aRepository.findOne(id);
    }

}

这里是来自 A 类的对象服务(执行更复杂的操作):

public class AService {

    private AManager aManager;

    @Transactional(readOnly = true)
    public A getA(long id) {
        return aManager.getA(id);
    }

}

这里有一个 jsp 调用我的服务:

(...)
A a = aService.getA(1);
a.someproperty = value; // Do not automatically commit this modification!!!!
(...)

为了安全起见,我更喜欢我从服务中获得的实体是分离的(实际上没有更多的管理)。但我有很多实体,而且经常是它们的集合。

目前我找到的唯一解决方案是:

public A getA(long id) {
    A a= aRepository.findOne(id);
    Hibernate.initialize(a.collectionProperty);
    entityManager.detach(a);

    return a;
}

我只有这个解决方案吗?当我有实体集合时该怎么办?在 Springboot 中是否有任何配置来管理它?在休眠中?

【问题讨论】:

  • 您在服务类方法上有@Transactional。因此,一旦您退出服务方法,事务将结束并且实体将自动分离,除非您配置了@Transaction,或者事务甚至在服务类之前在其他地方启动,这样就会产生整个 HTTP 请求.一旦退出服务类方法,您是否真的看到在 entity A 的 jsp 中所做的修改被提交给数据库。
  • 是的,我在数据库中看到了修改。我已经考虑过包装请求的事务,但我什么也没找到。我没有做任何类似这样的配置。
  • 您是否使用任何 web 框架 (jsp)?我的意思是struts,Spring MVC等。或者它只是一个直接访问管理器的jsp?随便猜,能不能在spring boot conf文件里加spring.jpa.open-in-view=false试试,因为默认是开启的。
  • spring.jpa.open-in-view=true 将启用OpenSessionInViewFilter,它打开session,在请求开始时将其绑定到transaction,并在请求处理完成后关闭它。所以我认为如果你在spring boot conf文件application.properties或yaml文件中设置spring.jpa.open-in-view=false,那应该会有所帮助。

标签: hibernate spring-boot transactional hibernate-session


【解决方案1】:

既然是 Spring Boot 应用程序,Spring Boot by default registers OpenEntityManagerInViewInterceptor。这将打开session(或entityManager),在请求开始时将其绑定到transaction,并在请求处理完成后将其关闭。

因此,您在请求未完成之前所做的任何更改都会被跟踪,因此 JSP 对实体的修改也会被跟踪,并提交给数据库。

所以我认为如果你在 spring boot conf 文件 application.properties 或 yaml 文件中设置 spring.jpa.open-in-view=false,那应该会有所帮助。

【讨论】:

猜你喜欢
  • 2017-05-29
  • 2013-07-30
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多