我有一個典型的Spring/Hibernate設置。這裏是我的Spring配置:HibernateTemplate保存執行插入但不更新
<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
public class PersonRepositoryImpl extends BaseRepositoryImpl<Person, String>
與服務:
@Service
public class PersonServiceImpl {
@Autowired
private PersonRepository _personRespository;
我打電話給以下方法,sav eSomeStuff(),當我插入使用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();
}
}
我想我可能有一個transaccionality問題,但正如我所說,在離開服務方法新的人是持久化到數據庫。在日誌中我看到:
插入到人......
不過,我所做的更新並不持久,並且沒有錯誤,並在日誌中沒有「更新」的SQL語句。我認爲HibernateTemplate.save()方法可能是問題,但是從saveSomeStuff()方法中,從數據庫加載Person之後,我執行System.out,並從數據庫加載的Person具有更新的名稱。
我在這裏錯過了什麼?
是的,那也不管用。 :) 看來,Hibernate足夠聰明,可以區分插入和更新。我也認爲我需要使用saveOrUpdate()。因爲這就是文檔所說的使用。但似乎save()可以很好地執行更新。它只是不堅持! – 2013-02-26 16:30:19