2016-04-19 8 views
0

を読み取ることができません。春のトランザクションは、私が春を使用していますとJUnit-方法を以下している更新された値

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:TestProject-spring-test.xml" }) 
@Transactional 
public abstract class BaseTest { 
[...] 

    @Test 
    public void testSaveLoadedObject() { 
     SubTestModel st = modelService.load(subTestPk); 

     st.setSimpleObject("testString"); 

     modelService.save(st); 

     //now reload the object to ensure that everything has been saved correctly 
     st = modelService.load(st.getId()); 
     s+= "\n#3 afterLoad: " + st.getSimpleObject(); 

     //fails: 
     Assert.assertTrue(st.getSimpleObject().equals("testString")); 
    } 
} 

ModelService-方法:

@Autowired 
private JdbcTemplate db; 

@Override 
@Transactional(propagation = Propagation.REQUIRED) 
public void save(final ItemModel model, String newValue) { 
    db.update("UPDATE table SET column=? WHERE id=?", new Object[] { newValue, model.getId() }); 
} 

@Override 
public <T extends AbstractItemModel> T load(final int id) { 
    ... 
    DAO.loadValue(...) 
} 

DAO-方法: @Autowired プライベートJdbcTemplate db;

@Override 
public <T> T loadValue(final AbstractItemModel model, final String columnName) { 
     final String sql = "SELECT column FROM table WHERE id=" + model.getId(); 

    Object plain = db.queryForObject(sql, new RowMapper<Object>() { 
     @Override 
     public Object mapRow(ResultSet r, int rowNum) throws SQLException { 
      return r.getObject(columnName); 
     } 
    }); 

    return plain; 

} 

続いて起こる:

元の値: enter image description here

をMySQLで( "SET SESSIONトランザクション分離レベルREAD UNCOMMITTED" を設定する際に目に見える)新しい値がDBに格納されます。 。

DB = "たTestString" enter image description here

*が、loadメソッドが呼び出されたとき、それは "古い"(=値が前に保存)値を取得します*

getSimpleObject-値で

getSimpleObject価値デバッガ= "simpleObjectValue"

ロードメソッドによって(同じトランザクションとメソッドで)最近保存された値を読み取ることができないのはなぜですか?

新しいトランザクションは作成されません。テストメソッド全体で "@トランザクション(分離= READ_UNCOMMITTED)"で隔離レベルを設定しても助けにならない

誰でもこの謎を解くことができますか?

ありがとうございます!

+0

すべては、ロードと保存の方法によって異なります。コードは重要です。 –

+0

hi。 saveはjdbctemplateを実行します。 "INSERT INTO ..." loadはjdbctemplate..queryForObject(...)を実行します – Niko

+0

さらに詳しい情報が必要ですか? – Niko

答えて

0

saveメソッドのREQUIRES_NEWへの変更を(dbの変更をコミットして新しいトランザクションを開くために)変更します。

さらに、テストに保存した後にフラッシュ呼び出しを追加してください(統合テストに適合させるためにコードを変更しない方がよい)。

+0

は、テストメソッドの変更が完了した後でもロールバックされていますか?それが必要なので、それ以外の場合はテストデータで埋め尽くすでしょう... "データを作成してチェックし、終了した後にすべてを戻します" - > @transactional – Niko

+0

私はしないときバネのトランザクション管理を使用し、同じトランザクションでjdbcによって手動で挿入して選択すると正常に動作します。何かが間違っているはずです... – Niko

関連する問題

 関連する問題