2011-10-27 11 views
1

休止保存、Hibernateはロールバック

public void incrementNumber(long id) throws Exception{ 
     Session session = factory.openSession(); 
     Number n = (Number)session.load(Number.class, id); 
     n.setNumber(n.getNumber() +5); 
//  throw new IllegalArgumentException("BLAH"); 
     session.close(); 
    } 
  1. 例外をコメントアウトすることで、更新がコミットされます。
  2. 例外をコメント解除(?)すると、例外がロールバックされます。

これを達成する方法はありますか?注:トランザクション部分は、トランザクションアノテーションのもとでサービス内で行われます。

+0

試してみてください:try {....休止状態のものを...} catch(illegalargumentexception e){session.rollback();} finally {session.close} – anfy2002us

答えて

1

DAOは主に永続性操作の責任を負います。これは、特定のエンティティに関連するCRUDといくつかのファインダメソッドを提供するだけです。

IMO、永続化操作ではなく、ビジネス操作に近い方法。サービスレイヤーを持っているので、このメソッドをそのレイヤーに移動することをお勧めします。

だから、あなたのNumberDAOは次のようになります。

public class NumberDAO { 

    public Number loadById(long id){ } 

} 

そして、あなたはNumberServiceは、次のようになります。あなたはサービス層でトランザクションアノテーションを使用したよう

public class NumberService{ 

     //Inject by DI containers , or setter/constructor 
     NumberDAO numberDAO; 

     public void incrementNumber(long id , int increaseAmount) throws Exception{ 

       Number n = (Number) numberDAO.loadById(id); 

       if (XXXXXXXX) 
        throws new IllegalArgumentException("BLAH BLAH BLAH BLAH"); 

       n.setNumber(n.getNumber() +increaseAmount); 
     } 

} 

を、それがあれば、自動的にコミットしますサービスメソッドが正常に返されます。メソッドが戻る前に例外がスローされた場合、トランザクションは自動的にロールバックされます。

+0

ありがとう、私はこれを試してみましたが、例外をスローしたときにデータベースにコミットするのに失敗しました...それに関する提案はありますか? –

+0

例外がスローされる場合、トランザクションはロールバックする必要があることを意味します。トランザクションをコミットする場合は、例外をスローしないでください。実際に何をしたいですか? –

+0

例外がスローされたときにコミットし、例外がスローされたときにロールバックします。何らかの理由で、例外がスローされない場合でも、更新はデータベースにコミットされません。 –