2014-09-05 8 views
0

Я использую Play версии 2.2 с Hibernate. Я пытаюсь создать еще один «слой» для управления операциями с базой данных, мне нужно обернуть каждую транзакцию в этом или есть еще один более элегантный способ сделать это, я должен сделать обходные пути для доступа к переменным, переданным методу.Слушать транзакции с Hibernate

JPA.withTransaction(new F.Callback0() { 

     @Override 
     public void invoke() throws Throwable { 
      ... 
      JPA.em().persist(someObject); 
      ... 
     } 
    }); 

ответ

0

Используйте аннотацию @Transactional

+0

@Transactional могут быть использованы только в методах действий. –

+0

вы можете добавить пользовательский обработчик аннотации и обернуть транзакционный код. –

0

В этом примере я использую aspjectj обернуть методы с тегами пользовательской аннотацией применить JPA сделку: github example.

  • SBT версия = 0.13.5
  • Play версия = 2.2.1

Plugins.sbt

logLevel := Level.Warn 

resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" 

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1") 

// Used to weave Logger calls in Controllers and service 
addSbtPlugin("com.typesafe.sbt" % "sbt-aspectj" % "0.9.4") 

build.scala

import com.typesafe.sbt.SbtAspectj.AspectjKeys.inputs 
import com.typesafe.sbt.SbtAspectj._ 
import sbt.Keys._ 
import sbt._ 

object Build extends Build { 

    val appName = "Interceptor" 
    val appVersion = "1.0-SNAPSHOT" 

    val main = play.Project(appName, appVersion) 
    .settings(aspectjSettings: _*) 
    .settings(inputs in Aspectj <+= compiledClasses, 
     products in Compile <<= products in Aspectj, 
     products in Runtime <<= products in Compile) 
} 

аннотаций

package service; 

/** 
* @author z.benrhouma 
* @since 09/09/2014 
*/ 
public @interface STransaction { 
} 

аспект сделки:

package aspects; 


import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import play.db.jpa.JPA; 
import play.libs.F; 

/** 
* @author z.benrhouma 
* @since 29/03/2014 
*/ 
@Aspect 
public class TransactionAspect { 

    @Around("execution(* service.*.*(..)) && @annotation(service.STransaction)") 
    public Object logAccessRules(final ProceedingJoinPoint thisJoinPoint) throws Throwable { 
      JPA.withTransaction(new F.Callback0() { 
       @Override 
       public void invoke() throws Throwable { 

        thisJoinPoint.proceed(); 
       } 
      }); 
     return null; 
    } 

} 

пример:

package service; 

/** 
* @author z.benrhouma 
* @since 09/09/2014 
*/ 

public class TransactionService { 

@STransaction // --> this method will be wrapped with JPA.withTransaction 
public static void doSomeProcessing(){ 
    System.out.println("hello with transaction"); 
} 
public static void doSomeProcessing2(){ 
    System.out.println("hello without transaction"); 
} 
} 
Смежные вопросы