Используйте Spring @Transactional в Scala - PullRequest
4 голосов
/ 08 декабря 2010

У нас есть смешанный проект Java и Scala, в котором используется управление транзакциями Spring. Мы используем аспекты Spring для создания файлов с аннотированными методами @Transactional.

Проблема в том, что классы Scala не связаны с аспектами транзакции Spring. Как настроить Spring для рассмотрения транзакции в Scala?

Ответы [ 3 ]

3 голосов
/ 04 января 2011

Spring требует, чтобы ваша граница транзакции начиналась с bean-компонентов, управляемых Spring, поэтому это исключает @Transactional классы Scala.

Похоже, простое решение состоит в том, чтобы создать фасады сервисов, в которых созданы @Transactional Java-классыкак весенние бобы.Они могут делегироваться вашему сервисному / базовому коду Scala.

2 голосов
/ 01 сентября 2012

Единственным решением для Scala является использование замыкания Эберхарда Вольфа, которое создает транзакцию вручную.Использование:

transactional() {
// do stuff in transaction
}

https://github.com/ewolff/scala-spring/blob/master/src/main/scala/de/adesso/scalaspring/tx/TransactionManagement.scala

https://github.com/ewolff/scala-spring/blob/master/src/main/scala/de/adesso/scalaspring/tx/TransactionAttributeWithRollbackRules.scala

Найдено здесь: http://www.slideshare.net/ewolff/scala-and-spring (слайд 41)

Лицензия:Apache

1 голос
/ 08 февраля 2015

В поддержке Scala @Transactional в Scala нет ничего особенного, и вы можете использовать ее без какого-либо Java-кода.Просто убедитесь, что у вас есть «чистые» черты для bean-компонентов, которые будут использовать аннотацию @Transactional.Вы также должны объявить bean-компонент с типом PlatformTransactionManager (если вы используете конфигурацию Spring на основе .xml, вы должны использовать "actionManager "для имени bean-компонента, подробности см. В JavaDoc EnableTransactionManagement).Кроме того, если вы используете классы конфигурации на основе аннотаций, убедитесь, что эти классы размещены в своих собственных выделенных файлах, т.е. не размещайте другие классы (объект-компаньон в порядке) в том же файле.Вот простой рабочий пример:

SomeService.scala:

trait SomeService {
  def someMethod()
}

// it is safe to place impl in the same file, but still avoid doing it
class SomeServiceImpl extends SomeService {
  @Transactional
  def someMethod() {
    // method body will be executed in transactional context
  }
}

AppConfiguration.scala:

@Configuration
@EnableTransactionManagement
class AppConfiguration {
  @Bean
  def transactionManager(): PlatformTransactionManager = {
    // bean with PlatformTransactionManager type is required
  }

  @Bean
  def someService(): SomeService = {
    // someService bean will be proxied with transaction support
    new SomeServiceImpl
  }
}

// companion object is OK here
object AppConfiguration {
  // maybe some helper methods  
}

// but DO NOT place any other trait/class/object in this file, otherwise Spring will behave incorrectly!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...