次のような特定のメソッドを使用したサービス実装があります。
public class ExampleServiceImpl implements ExampleService {
@AutoWired
@Resource
private RecordRepository recordRepository;
private void processRecord() {
// some code here
}
@Transactional(readOnly=false)
public void processRecord(Record a) {
Record original = getOriginal(a);
recordRepository.saveChanges(a,original);
}
}
Record クラスは、オブジェクト グラフのルート オブジェクトです。RecordRepository は、グラフ内のオブジェクトのさまざまな子を保存するためのサブリポジトリを使用して、次のようになります。
public class RecordRepository extends BaseRepository<Record> {
@AutoWired
@Resource
private IDao databaseDao;
@AutoWired
@Resource
private SubRecordRepository subRecordRepository;
public void saveChanges(Record a, Record b) {
//Perform some processing on a, b
for(SubRecord subA : a.getSubRecords()) {
subRecordRepository.saveChanges(subA);
}
databaseDao.updateRecord(a);
}
}
public class DatabaseDao extends NamedParameterJdbcDaoSupport implements IDao {
@Autowired
public DatabaseDao(@Qualifier("org.somewhere.Datasource") DataSource ds) {
super();
this.setDataSource(ds);
}
public void updateRecord(Record inRecord) {
String query = (String) sql.get("updateRecord");
SqlParameterSource parms = new BeanPropertySqlParameterSource(inRecord);
getNamedParameterJdbcTemplate().update(query, parms);
}
public void insertSubRecord(SubRecord inSubRecord) {
String query = (String) sql.get("insertSubRecord");
SqlParameterSource parms = new BeanPropertySqlParameterSource(inSubRecord);
getNamedParameterJdbcTemplate().insert(query, parms);
}
// other update and insert methods
}
トランザクションは、processRecord 呼び出しから関連するすべての挿入\更新に適用されますか? つまり、挿入または更新が失敗した場合、以前に呼び出された ExampleServiceImpl.processRecord からのすべての挿入および更新はロールバックされますか?