java – 在独立应用程序中使用@Transactional
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在独立应用程序中使用@Transactional,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2618字,纯文字阅读大概需要4分钟。
内容图文
![java – 在独立应用程序中使用@Transactional](/upload/InfoBanner/zyjiaocheng/787/6baab7a050dd4f35801206bd14e2bf15.jpg)
我正在开发一个暴露REST API的独立应用程序.
我用我能找到的最标准的库来制作它.基本上,我使用JPA2,Hibernate(和Guice进行依赖注入).这是我的主要依赖项:
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.10.Final</version>
</dependency>
EntityManagerFactory和EntityManager通过自定义Guice Provider注入.
一切正常,但到目前为止,我必须手动处理交易,如:
@javax.inject.Inject
private EntityManager em;
public void foo() {
try {
em.getTransaction().begin();
doSomething();
em.getTransaction().commit();
} catch() {
em.getTransaction().rollback();
}
}
我每次需要交易时都不想使用try / catch.在另一个项目中,将Spring放在servlet容器中,我可以这样写:
@Transactional
public void foo() {
doSomething();
}
有非弹簧解决方案吗? (我已经使用Guice进行依赖注入).
编辑(回答Adam Siemion).这是我如何通过自定义我的Guice的EntityManager提供程序来创建1个EntityManager / Thread.它对我来说似乎仍然很危险,因为可以在下一个Transaction上使用相同的EntityManager(可能处于脏状态):
public class EntityManagerProvider implements Provider<EntityManager> {
private static ThreadLocal<EntityManager> entityManagerThreadLocal
= new ThreadLocal<>();
@Inject
private EntityManagerFactory entityManagerFactory;
@Override
public EntityManager get() {
EntityManager entityManager = entityManagerThreadLocal.get();
if(entityManager == null) {
entityManager = entityManagerFactory.createEntityManager();
entityManagerThreadLocal.set(entityManager);
}
return entityManager;
}
}
解决方法:
您可以绑定自定义拦截器
TransactionalMethodInterceptor interceptor = new TransactionalMethodInterceptor();
在Guice:
bindInterceptor(annotatedWith(Transactional.class), any(), interceptor);
bindInterceptor(any(), annotatedWith(Transactional.class), interceptor);
但首先将EntityManager注入TransactionalMethodInterceptor:
requestInjection(interceptor);
它将拦截对使用Transactional注释注释的方法的所有调用.
你的拦截器可能是这些方面的东西:
class TransactionalMethodInterceptor implements MethodInterceptor {
@javax.inject.Inject
private EntityManager em;
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
try {
Object result = invocation.proceed();
em.commit();
} catch (Exception e) {
em.rollback();
throw e;
}
}
}
MethodInterceptor和MethodInvocation来自aopalliance库.
内容总结
以上是互联网集市为您收集整理的java – 在独立应用程序中使用@Transactional全部内容,希望文章能够帮你解决java – 在独立应用程序中使用@Transactional所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。