@Override
 protected Object proceed(MethodInvocation invocation) throws Throwable {
   invocation.proceed();
   if (invocation.didThrowCheckedException()) {
     invocation.rethrow();
   }
   return invocation.getReturnValue();
 }
  @Override
  public void advise(MethodInvocation invocation) {
    Session session = manager.getSession();

    Transaction transaction = session.beginTransaction();

    try {
      invocation.proceed();

      // Note: as per EJB specs, a checked exception is still considered
      // success, and the transaction still commits.

      transaction.commit();
    } catch (RuntimeException e) {
      transaction.rollback();

      throw e;
    }
  }