【问题标题】:Why can I save without @Transactional? [duplicate]为什么没有@Transactional 我可以保存? [复制]
【发布时间】:2018-05-28 12:39:06
【问题描述】:

简化示例:

@Entity
public class Foo {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
  private String bar;

  // getters + setters

}

public interface FooRepository extends CrudRepository<Foo, Integer> {
}

@Service
public class FooService {

  private final FooRepository repository;

  public FooService(FooRepository repository) {
    this.repository = repository;
  }

  public Foo save(Foo foo) {
    return repository.save(foo);
  }

}

从控制器调用fooService.save(myNewFoo) 是可行的,但我预计它会失败(如果我正确理解事务),因为没有方法用@Transactional 注释(我实际上希望它失败)。知道为什么会出现这种行为吗?谁在现场创建交易,如何避免这种情况?

其他细节:

  • Java 9
  • MySQL 连接器 6.0.6
  • 休眠 5.2.12
  • Spring Boot 2.0.0.M7
  • Spring Data JPA 2.0.2.RELEASE

【问题讨论】:

  • 默认CrudRepository和好友的方法是@Transactional
  • @M.Deinum 有什么办法让他们不是@Transactional 那么?除了自己重写整个实现之外?我希望我的服务负责交易,否则失败。
  • @M.Deinum 也许我可以扩展SimpleJpaRepository 并以某种方式禁用@Transactions?
  • 如何阅读发行说明...jira.spring.io/browse/DATAJPA-685
  • @M.Deinum 听起来不错。

标签: java mysql hibernate spring-boot spring-data-jpa


【解决方案1】:

Spring提供的CrudRepository#save的实现默认创建一个事务。详情请见the documentation

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多