私は典型的なSpring / Hibernateのセットアップをしています。これが私の春の設定です:
<context:annotation-config />
<context:component-scan base-package="com.myco.myapp.modules" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionFactory"
...
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
私は BaseRepository を持っています:
@Transactional(propagation = Propagation.MANDATORY)
public final T save(final T entity) throws RepositoryException {
try {
getHibernateTemplate().save(entity);
return entity;
} catch (DataAccessException e) {
throw new EntityCouldNotBeSavedException(getPersistentClass(),
e);
}
}
そして、それを拡張する Repository クラス:
@Repository
public class PersonRepositoryImpl extends BaseRepositoryImpl<Person, String>
そしてサービス:
@Service
public class PersonServiceImpl {
@Autowired
private PersonRepository _personRespository;
次のメソッド saveSomeStuff() を呼び出します。BaseRepository.save() を使用して挿入すると、完全に機能します。しかし、更新しようとしても、変更は行われません。
@Override
@Transactional
public void saveSomeStuff() {
try {
Person existingPerson = _personRespository.findById("1");
existingPerson.setName("John");
_personRespository.save(existingPerson);
Person dbExistingPerson = _personRespository.findById("1");
// This prints "John".
System.out.println(dbExistingPerson.getName());
Person newPerson = new Person();
newPerson.setName("Jack");
_personRespository.save(newPerson);
} catch (RepositoryException e) {
e1.printStackTrace();
}
}
トランザクションの問題があるのではないかと思いましたが、前述したように、Service メソッドを終了すると、新しい Person がデータベースに保持されます。ログに次のように表示されます。
人に挿入...
ただし、私が行った更新は永続化されておらず、ログにエラーも 'update' sql ステートメントもありません。HibernateTemplate.save() メソッドが問題かもしれないと思いましたが、saveSomeStuff() メソッド内から、データベースから Person をロードした後、System.out を実行すると、データベースからロードされた Person の名前が更新されます。
ここで何が欠けていますか?