SpringBootでトランザクション処理を実装していますが、うまく動作していないため質問です。
DBはMySQLを利用しており、Entityからテーブルを作成しております。
@Transactionalアノテーションを使ってトランザクション処理を実装しているのですが、
プライマリーキーのカラムに「@GeneratedValue(strategy = GenerationType.IDENTITY)」を設定すると
エラーが発生してもロールバックされません。
(「@GeneratedValue」の指定だけであればロールバックは実行されています)
こちらは実装方法に問題があるのか、または仕様通りの動作であるのか、どちらでしょうか。
ご回答よろしくお願いします。
SpringBoot: 2.1.5
MySQL: 8.0.16
ソースコード
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test_db spring.datasource.username=user spring.datasource.password=user1 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update
SampleController.java
@RestController public class SampleController { @Autowired UserService userService; @RequestMapping("/sapmle") public String sample() { try { userService.save("サンプル"); } catch (Exception e) { System.out.println(e); } return "success"; } }
UserService.java
@Service public class UserService { @Autowired UserRepository userRepository; @Transactional public void save(String name) { UserEntity entity = new UserEntity(); entity.setName(name); userRepository.save(entity); throw new RuntimeException(); // エラーを発生させる } }
UserRepository.java
@Repository public interface UserRepository extends JpaRepository<UserEntity, Integer> { }
UserEntity.java
@Entity @Table(name="user") @Data public class UserEntity { @Id @GeneratedValue // ロールバックが行われる // @GeneratedValue(strategy = GenerationType.IDENTITY) // ロールバックが行われない private Integer id; @Size(max=32) private String name; }
テーブル情報
@GeneratedValueのとき
mysql> show columns from user; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(32) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
@GeneratedValue(strategy = GenerationType.IDENTITY)のとき
mysql> show columns from user; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(32) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/21 15:48