事务后Hibernate自动保存

时间:2014-06-19 15:54:38

标签: java spring hibernate java-ee

这是我的休眠关系

@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的变化并决定保留更改。问题是,如何避免这种行为!!!

2 个答案:

答案 0 :(得分:0)

会话缓存中的对象将与Session.flush()上的数据库同步,包括使用CascadeType.ALL时的关系。

如果要避免某些对象的同步,可以在事务提交之前使用Session.evict(someObject)方法。

答案 1 :(得分:0)

我找到了解决方案,我忘了说我使用的是Spring,所以最后我将@Transactional(readOnly = true)添加到我的方法中而不是服务类级别。