这是我的休眠关系
@OneToMany(cascade = {CascadeType.ALL})
@JoinColumn(name = "b_id", nullable = false)
@XmlElement
@JsonIgnore
@Getter
@Setter
private List<A> aList = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "b_id", nullable = false, insertable = false, updatable = false)
@XmlTransient
@Getter
@Setter
private B b;
所以就像我调用方法x,我从数据库实体B得到然后我设置新的aList与所有A的id为null,进入B然后我在方法中返回B但我不保存B在任何时刻。当我在B中看到aList的值时,aList中的A已经有了id,所以在某些时候B保存在数据库中,aList是在级联上完成的。 问题是我在我的Controller中调用@Service类中的这个方法,所以我认为因为事务已经完成,Hibernate会检测到B的变化并决定保留更改。问题是,如何避免这种行为!!!
答案 0 :(得分:0)
会话缓存中的对象将与Session.flush()
上的数据库同步,包括使用CascadeType.ALL
时的关系。
如果要避免某些对象的同步,可以在事务提交之前使用Session.evict(someObject)
方法。
答案 1 :(得分:0)
我找到了解决方案,我忘了说我使用的是Spring,所以最后我将@Transactional(readOnly = true)添加到我的方法中而不是服务类级别。