2017-05-29 134 views
2

我正在开发一个项目,并使用Hibernate + JPA来管理我的数据库。用Hibernate管理交易

但是,当我在写我的服务,我有写类似,所有的时间:

public String subscribe(String lastName, String firstName, String username, String borndate, String managerPwd) throws AuthenticationException, ExistingSubscriberException, SubscriberException, BadParametersException { 
    try { 
     this.authenticateMngr(managerPwd); 

     this.em.getTransaction().begin(); 

     // Generate password and birthdate 
     String password = UUID.randomUUID().toString(); 
     Calendar birthdate = CalendarManipulator.convertToCalendar(borndate); 

     // Save player 
     try { 
      this.playerService.add(firstName, lastName, birthdate, username, password); 
     } catch (PlayerAlreadyExistException e) { 
      throw new ExistingSubscriberException(); 
     } catch (InvalidNameException | MinorPersonException | NullParameterException | InvalidPasswordException e) { 
      throw new BadParametersException(); 
     } catch (Exception e) { 
      this.unexeptedException(e); 
     } 

     this.em.getTransaction().commit(); 

     return password; 
    } 
    catch (Exception e) { 
     this.em.getTransaction().rollback(); 
     throw e; 
    } 
} 

这部分代码:

public void function { 
    try { 
     this.em.getTransaction().begin(); 

     // ....... 

     this.em.getTransaction().commit(); 

    } 
    catch (Exception e) { 
     this.em.getTransaction().rollback(); 
     throw e; 
    } 
} 

我必须把它写在每个服务...超过50:(

我不使用春天(我知道一些解决方案存在它),我在我的项目中单独使用Hibernate + JPA

是否存在解决方案来做同样的事情,而不重复自己:)?

+0

是的如果你使用Spring,它有一个名为@Transactional的注解,它将自动完成所有这些注释。查看这里:https://docs.spring.io/spring/docs /current/javadoc-api/org/springframework/transaction/annotation/Transactional.html –

+0

如果您不使用spring,则可以创建一个“Transactable”接口并将其传递给一个对象,该对象的唯一工作是捕获事务失败并将其滚动背部。一个工厂应该足够了 – efekctive

回答

2

如果使用普通的Java - 然后是的,你应该写在每一个服务这个样板代码。 但是,您可以使用AOP,并为声明式事务划分创建自己的建议。

+0

好的,我会看到的。谢谢:) – graille

2

你不需要一遍又一遍的写下它们。您可以使用Spring框架自动执行此操作。在Spring框架中有一个名为@Transactional的注解here

+0

了解并实现Spring框架需要几个小时:s。事实上,我会感兴趣,但我写的代码是为了一个学生项目,我必须在明天完成^^'。 – graille

+1

@graille之所以我不推荐你,是因为你标记了Spring并谈论了学习Spring.Good运气 –