如果我有一个存储库:public interface ThingRepository extends JpaRepository<Thing, UUID> { @Query(/* query to get some Things */) Collection<Thing> getSomeThings(/* some arguments */);}哪个是由 Spring/Hibernate 自动装配的,Thing返回的实体对象将处于什么状态(持久/分离/瞬态/等)?上下文 - 如果我们对返回的Thing(EG thing.setThingString("stuff!"))进行更改,是否存在将这些更改持久化回数据库而不显式调用的情况thingRepository.save(thing);?
2 回答
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
跃然一笑
TA贡献1826条经验 获得超6个赞
一切都与事务边界有关。
如果您的方法在任何事务之外被调用,则底层 entityManager 已经关闭并且返回的实体已分离。
如果您的方法在现有事务中被调用,则 entityManager 仍处于打开状态并且返回的实体处于托管状态。请注意,在这种情况下,如果事务被标记为只读,则 entityManager 将永远不会被刷新,即使实体被管理,也不会保留任何修改。
另请注意,内部逻辑事务属性不会覆盖readOnly 标志(与 rollbackFor 相反)
public class A {
@Transactional(propagation = Propagation.REQUIRED)
public void performA() {
// b transaction scope is not read only, but TransactionManager will rollback for checkedException thrown from here
b.performB();
}
}
public class B {
@Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = CheckedException.class)
public void performB() {
}
}
添加回答
举报
0/150
提交
取消