在 Scala 中使用 Spring @Transactional
我们有一个混合 Java 和 Scala 的项目,它使用 Spring 事务管理。我们使用 Spring 方面将文件与 @Transactional 带注释的方法编织在一起。
问题是,Scala 类没有与 Spring 事务方面交织在一起。如何配置 Spring 来处理 Scala 中的事务?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Spring 需要事务边界以 Spring 管理的 bean 开始,因此这排除了
@Transactional
Scala 类。听起来简单的解决方案就是将 @Transactional Java 类实例化为 Spring bean 的服务外观。这些可以委托给您的 Scala 服务/核心代码。
Spring needs your transaction boundary to begin with Spring-managed beans, so this precludes
@Transactional
Scala classes.It sounds like the simple solution is to make service facades which are
@Transactional
Java classes instantiated as Spring beans. These can delegate to your Scala service/core code.仅限 Scala 的解决方案是使用 Eberhard Wolff 的闭包来创建手动事务。用法:
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
A Scala-only solution is to use Eberhard Wolff's closure that creates a manual transaction. Usage:
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
Found here: http://www.slideshare.net/ewolff/scala-and-spring (slide 41)
License: Apache
Spring 在 Scala 中的
@Transactional
支持没有什么特别之处,您无需任何 Java 代码即可使用它。只需确保您具有 bean 的“纯”特征,其实现将使用 @Transactional 注释。您还应该声明一个PlatformTransactionManager
类型的 bean(如果您使用基于 .xml 的 Spring 配置,则应该使用“transactionManager”作为 bean 名称,请参阅 EnableTransactionManagement 的 JavaDoc 了解详细信息)。另外,如果您使用基于注释的配置类,请确保将这些类放置在它们自己的专用文件中,即不要将任何其他类(伴生对象可以)放置在同一文件中。这是简单的工作示例:SomeService.scala:
AppConfiguration.scala:
There is nothing special about Spring's
@Transactional
support in Scala and you can use it without any Java code. Just make sure that you have "pure" traits for beans, which implementations would use@Transactional
annotation. You should also declare a bean withPlatformTransactionManager
type (if you are using .xml-based Spring configuration, you should use "transactionManager" for bean name, see EnableTransactionManagement's JavaDoc for details). Also, if you are using annotation-based configuration classes, be sure that these classes are placed in their own dedicated files, i.e. don't place any other classes (companion object is OK) in the same file. Here is simple working example:SomeService.scala:
AppConfiguration.scala: