aktualisiert Wert habe ich gelesen, Frühling bin mit und haben folgende junit-Methode:Frühling Transactional nicht
@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-Methode:
@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-Methode: @Autowired private 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;
}
passiert folgendes:
der neue Wert in der DB gespeichert ist (sichtbar, wenn "SET Sitzungstransaktion Isolationsstufe UNCOMMITTED" -Einstellung) in mysql .
getSimpleObject-Wert in DB = "teststring"
* aber, wenn die Last-Methode aufgerufen wird, ist es den "alten" bekommt Wert (= Wert vor speichern) *
getSimpleObject-Wert in Debugger = "simpleObjectValue"
Warum kann der zuletzt gespeicherte Wert (in der gleichen Transaktion und Methode) nicht von der Load-Methode gelesen werden?
Sie sehen, dass es keine neue Transaktion erstellt. Auch die Einstellung der Isolationsstufe mit "@Transaction (isolation = READ_UNCOMMITTED)" über die gesamte Testmethode hilft nicht
Kann jemand dieses Geheimnis lösen?
Vielen Dank im Voraus!
Es hängt alles davon ab, was die Lade- und Speichermethoden tun. Der Code ist wichtig. –
Hallo. save führt eine jdbc-template aus. "INSERT INTO ...". load führt eine jdbctemplate..queryForObject (...) aus – Niko
Benötigen Sie weitere Informationen? – Niko