bra*_*ter 6 spring jpa transactions jax-rs
我正在使用JAX-RS提供基于HTTP的界面来管理数据模型.数据模型存储在数据库中并通过JPA进行交互.
这允许我修改数据模型的接口以适应REST客户端,并且大多数似乎工作得很好.但是,我不确定如何处理由JAX-RS资源提供的方法需要事务的情况,这会影响JPA get,update,commit-on-tx-end模式,因为只有事务包装get操作,因此永远不会提交更新.如果单个REST操作需要多个JPA操作,我可以看到同样的问题.
由于我正在使用Spring的事务支持,显而易见的事情是@Transactional在JAX-RS资源中应用这些方法.但是,为了实现这一点,Spring需要管理JAX-RS资源的生命周期,而我所知道的使用示例在需要时通过"new"创建资源,这让我有点紧张.
我可以想到以下解决方案:
有人有什么建议吗?我很可能错过了某个关键点.
更新 - 为了解决get,update,commit-on-tx-close流程周围缺少事务的问题,我可以公开EntityManager merge(object)方法并手动调用它.不整齐,但不能解决更大的问题.
更新2 @skaffman代码示例:在JPA服务层,注入,注释工作
public class MyEntityJPAService {
...
@Transactional(readOnly=true) // do in transaction
public MyEntity getMyEntity(final String id) {
return em.find(MyEntity.class, id);
}
Run Code Online (Sandbox Code Playgroud)
在JAX-RS资源中,由new创建,没有事务
public class MyEntityResource {
...
private MyEntityJPAService jpa;
...
@Transactional // not injected so not effective
public void updateMyEntity(final String id, final MyEntityRepresentation rep) {
MyEntity entity = jpa.getMyEntity(id);
MyEntity.setSomeField(rep.getSomeField());
// no transaction commit, change not saved...
}
Run Code Online (Sandbox Code Playgroud)
我有一些建议
在 JPA 和 JAX-RS 层之间引入一个层。该层将由 Spring 管理的 bean 组成@Transactional,并将通过其组件 JPA 调用组成各种业务级操作。这有点类似于您的 (1),但保持 JPA 层简单。
将 JAX-RS 替换为 Spring-MVC,后者提供相同(或相似)的功能,包括@PathVariable、@ResponseBody等。
使用 . 以编程方式将 JAX-RS 对象包装在事务代理中TransactionProxyFactorybean。这将检测您的@Transactional注释并生成一个尊重它们的代理。
使用@ConfigurableAspectJ LTW 来允许 Spring 遵守@Transactional,即使您使用 new 创建对象。请参见8.8.1 使用 AspectJ 通过 Spring 依赖注入域对象
| 归档时间: |
|
| 查看次数: |
2438 次 |
| 最近记录: |