2015-04-14 132 views
3

我想在CrudRepository接口上实现事务。我是一个初学者,我目前的问题是,当收到来自不同客户的很多请求时,我有时会得到重复。 为了避免我想在Spring中使用SQL事务及其实现,但我无法使它工作。春季数据CrudRepository和交易

下面是我试图做到这一点:

@Repository 
@EnableTransactionManagement 
@Transactional 
public interface ApplicationPackageDao extends CrudRepository<ApplicationPackage, Long> { 

/** 
* Find if a record exists for this package name , 
* @param packageName 
* @return 
*/ 
@Transactional 
ApplicationPackage findByPackageName(String packageName); 

} 

但是它似乎并没有工作。 我试图在我打电话的Java方法的早期添加@Transactionnal注解,但是我也无法使其工作。

我该如何处理CrudRepository上的事务? 还是我用完全错误的东西?

+0

您是否尝试过在方法的顶部使用'@ Query'注释?例如:'@Query(“从UPPER(?1)”)'UPPER(a。[attr])中选择一个[object] – chesh

+0

@chesh将查询注释允许我获取事务操作。我的主要问题是CrudRepository隐含的方法,比如保存。我希望在允许findByPackageName之前等待执行save。 –

回答

2

我的建议是:

使用@Configuration注释检查您的上下文和配置类。从documentation

的@EnableTransactionManagement注解提供相当于 支持,如果您使用的是基于Java的配置。只需将 注释添加到@Configuration类

@EnableTransactionManagement和只着眼 为@事务上豆类在同一个应用程序上下文他们在

定义,那么你可以在你的服务中使用@Transactional 即使在方法

希望它可以帮助

+0

谢谢,现在效果更好。其实看起来我在其他地方有另一个问题,但现在我对交易有了更好的认识。非常感谢。 –

+0

@ crm86对于Spring Boot,不需要为CrudRepository扩展bean提供显式的java配置;在这种情况下,这个注释是否仍然需要,还是不适用(当Spring Boot创建bean时它会自动启用?)? – acidnbass

7

除了crm86的回答一些更笔记@Transactional注释:

  • 在您的应用程序中注释入口点似乎是最佳实践(例如,您的Web控制器方法或预定批次的主要方法)。通过使用注释属性TxType,可以确保应用程序中位于更深处的方法中的约束/条件(例如,如果没有trx-context正在运行,则会抛出TxType.MANDATORY等)。

  • @Transactional注释只有在类被加载为spring bean(例如在类级别的@Component注释)时才有效果。

  • 请记住,只有RuntimeException会导致回滚。如果您希望导致回滚的checked异常,则必须使用属性rollbackOn来枚举每个此类异常。

  • 类级别的注释适用于此类的所有公共方法。方法级别注释会覆盖类级别的注释。上例中的重复注释(首先在类级别,然后是方法级别)不起作用。