Exemplo de controle de transação com SpringData e Scala
package com .codesimples .jdbc
import com .typesafe .scalalogging .Logger
import org .springframework .transaction .support .{TransactionCallbackWithoutResult , TransactionTemplate }
import org .springframework .transaction .{PlatformTransactionManager , TransactionStatus }
trait JDBCTemplate {
implicit val platformTransactionManager : PlatformTransactionManager
implicit val logger : Logger
def withTransaction ( callback : => Unit ) = {
val transactionCallback : TransactionCallbackWithoutResult = transactionalCallback(callback)
new TransactionTemplate (platformTransactionManager).execute(transactionCallback)
}
def transactionalCallback (callback : => Unit ): TransactionCallbackWithoutResult = {
new TransactionCallbackWithoutResult {
override def doInTransactionWithoutResult (transactionStatus : TransactionStatus ) = {
try {
callback
transactionStatus.flush()
} catch {
case e : Exception => {
transactionStatus.setRollbackOnly()
logger.error(" Transaction Error: " , e)
}
}
}
}
}
}
package com .codesimples .jpa
import javax .persistence .EntityManager
import com .typesafe .scalalogging .Logger
trait JPATemplate {
implicit val logger : Logger
implicit val entityManager : EntityManager
def withTransaction ( callback : => Unit ) = {
val transaction = entityManager.getTransaction
transaction.begin()
try {
callback
transaction.commit()
} catch {
case e : Exception => {
if (transaction.isActive) transaction.rollback()
logger.error(" Transaction Error: " , e)
}
}
}
}
val user = Map [String ,AnyRef ](
" id" - > UUID .randomUUID().toString,
" persistenceType" - > " jdbc"
)
userPersistenceAdapter.withTransaction {
userPersistenceAdapter.saveUser(user)
}