我有一个典型的 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 具有更新的名称。
我在这里想念什么?