使用Springboot在JSP中进行事务管理

时间:2018-03-13 13:21:12

标签: hibernate spring-boot transactional hibernate-session

有没有办法在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中进行管理?在Hibernate?

1 个答案:

答案 0 :(得分:1)

因为它是一个Spring启动应用程序,Spring Boot by default registers OpenEntityManagerInViewInterceptor。这将打开session(或entityManager),在请求启动时将其绑定到transaction,并在请求处理完成后关闭它。

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

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