javax.persistence.RollbackException:rollbackOnlyAskとしてマークされたトランザクション
Javax Persistence Rollbackexception
SpringMVCを使用。ゲームを入手して更新する方法がありますが、更新しようとするとエラーが発生します。これは次のコードです。
HomeController.class
@Transactional @RequestMapping(value = '/partida/{idPartida}', method = RequestMethod.GET) public String getPartida(@PathVariable('idPartida') long idPartida, Model model) throws IOException { Partida p = ServicioAplicacionPartida.getPartida(entityManager, idPartida) if (p.getJson() == null) { p.inicializarPartida(entityManager) ServicioAplicacionPartida.update(entityManager, p) }
GameDAO.class
@Transactional public static Partida update(EntityManager entityManager, Partida p) { try { Query q = entityManager.createNativeQuery('update Partida p SET p.json=:json where p.id=:id') q.setParameter('json', p.getJson()) q.setParameter('id', p.getId()) q.executeUpdate() return entityManager.find(Partida.class, p.getId()) } catch (Exception e) { e.printStackTrace() return null } }
行 'q.executeUdate()'が実行されると、エラーが発生します。これは次のとおりです。
javax.persistence.PersistenceException:org.hibernate.exception.DataException:ステートメントを実行できませんでした
そしてこれはサーバーエラーです:
Estado HTTP 500-リクエスト処理に失敗しましたネストされた例外はorg.springframework.transaction.TransactionSystemExceptionです:JPAトランザクションをコミットできませんでしたネストされた例外はjavax.persistence.RollbackException:トランザクションはrollbackOnlyとしてマークされています
それを修正するにはどうすればよいですか?
コントローラとDAOメソッドに@Transactionalアノテーションを付けましたが、@ Transactionalは内部メソッドに継承される可能性があるため、正しくありません。通常、トランザクションはサービスレイヤーで開始する必要があります。
これらのパラメーターを@Transactionalアノテーションに追加して、コントローラーまたはDAOから削除してみてください。
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor=Exception.class)
試してみてください:
propagation = Propagation.REQUIRES_NEW