我正在编写一个应用程序,提供管理 JPA 实体(使用 Hibernate)的 REST 服务(使用 Apache-CXF)。
我对事务管理有点迷茫,希望得到您关于这个主题的建议。
目前,我在我的业务 REST 服务和较低服务之间放置了一个中间层,仅用于事务管理目的。
目前,我的代码看起来很像:
@Service
class PersistanceService<MyBusinessClass>{
MyBusinessClass load(Long id);
void save(MyBusinessClass businessObject);
}
@Service
class BusinessService<MyBusinessClass>{
void doSomethingOn(MyBusinessClass businessObject);
}
@Service
class TransactionBusinessService<MyBusinessClass>{
@Transactional
void doSomethingOn(Long id) {
MyBusinessClass businessObject = persistanceService.load(id);
businessService.doSomethingOn(businessObject);
persistanceService.save(businessObject);
}
}
@Service
@path("/foo")
class RESTService {
@Path("/doSomething")
void doSomethingOn(Long id) {
transactionBusinessService.doSomethingOn(id);
}
}
我认为 TransactionBusinessService 太过分了。我希望“Spring”或“CXF”为我处理事务:我觉得请求是这样做的良好粒度:在每个请求开始时初始化一个实体管理器,并在最后提交更新.
我尝试将 @Transactional 注释添加到 REST 方法本身,但它似乎被忽略,或者与 CXF 冲突。
- 您认为在请求级别委托(delegate)事务并且不再担心它是一个好主意吗?
- 如何让 Spring 或 CXF 将事务管理绑定(bind)到我的请求?
预先感谢您的建议。
最佳答案
Do you think it is a good idea to delegate the transaction at the request level and not to bother about it anymore ?
通常这不是一个好主意,因为:
- 通常分离事务隔离不太方便
- 如果您需要在
for-loop
中进行一些更改,每个更改都必须有自己的事务,这也不是 那个透明;同时在服务层,您可以决定是否需要整个循环是事务性的还是每次迭代; tx:annotation-driven
(以及其他一些 AOP 拦截器)如果直接在 Controller 中使用 AOP 注释,有时会有点不可预测(至少我在 Spring MVC/中遇到过这样的问题) struts2 和其他一些框架)
所以基本上,你有 3 层:
- 持久层,仅负责存储/获取数据;
- 服务层,负责数据准备和AOP注释(
@Transactional
、@PreAuthorize
、@Cacheable
等),其中使用持久层; - Controller 级别,获取请求、绑定(bind)业务模型、可能验证它、将模型传递到服务层并从那里返回结果或处理异常
How can I have Spring or CXF bind the transaction management to the requests for me?
请确保您:
- 您的配置中有适当的
TransactionManager
('org.springframework.transaction.PlatformTransactionManager` 实现) - 您的配置中有
tx:annotation-driven
- 这些 Bean 在 CXF 服务的配置中可见
<bean name="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="txManager"/>
关于java - JPA 事务和 REST 服务 : Good practices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15364318/