使用 Spring Boot 在 JSP 中进行事务管理
Transaction managment in JSP with Springboot
有没有办法在Springboot应用中简单的获取detached实体?
为了说明(我保留了严格的最小值):
这里是实体 A 的存储库:
public interface ARepository extends JpaRepository<A, Long> { (...) }
这里是 A class 对象的管理器(执行一些原子操作):
public class AManager {
private ARepository aRepository;
@Transactional(readOnly = true)
public A getA(long id) {
return aRepository.findOne(id);
}
}
这里是来自 A class 的对象服务(做更复杂的操作):
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 中是否有任何配置来管理它?在休眠中?
由于它是 spring 启动应用程序,Spring Boot by default registers OpenEntityManagerInViewInterceptor。这将打开 session
(或 entityManager),在请求开始时将其绑定到 transaction
,并在请求处理完成后将其关闭。
因此,在请求未完成之前您所做的任何更改都将被跟踪,因此对实体的 JSP 修改也是如此,并提交给数据库。
所以我认为如果您在 spring 启动配置文件 application.properties
或 yaml 文件中设置 spring.jpa.open-in-view=false
,应该会有帮助。
有没有办法在Springboot应用中简单的获取detached实体?
为了说明(我保留了严格的最小值):
这里是实体 A 的存储库:
public interface ARepository extends JpaRepository<A, Long> { (...) }
这里是 A class 对象的管理器(执行一些原子操作):
public class AManager {
private ARepository aRepository;
@Transactional(readOnly = true)
public A getA(long id) {
return aRepository.findOne(id);
}
}
这里是来自 A class 的对象服务(做更复杂的操作):
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 中是否有任何配置来管理它?在休眠中?
由于它是 spring 启动应用程序,Spring Boot by default registers OpenEntityManagerInViewInterceptor。这将打开 session
(或 entityManager),在请求开始时将其绑定到 transaction
,并在请求处理完成后将其关闭。
因此,在请求未完成之前您所做的任何更改都将被跟踪,因此对实体的 JSP 修改也是如此,并提交给数据库。
所以我认为如果您在 spring 启动配置文件 application.properties
或 yaml 文件中设置 spring.jpa.open-in-view=false
,应该会有帮助。