Java 事务后休眠自动保存

Java 事务后休眠自动保存,java,spring,hibernate,jakarta-ee,Java,Spring,Hibernate,Jakarta 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, i

这就是我的冬眠关系

@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;
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name=“b_id”,nullable=false)
@XmlElement
@杰索尼奥雷
@吸气剂
@塞特
私有列表列表=新的ArrayList();
@许多酮
@JoinColumn(name=“b_id”,nullable=false,insertable=false,updateable=false)
@XmlTransient
@吸气剂
@塞特
私人B,;
就像我调用方法x一样,我从数据库实体B中获取,然后我将所有A的id为null的新列表设置为B,然后我在方法中返回B,但我不会在任何时候保存B。当我在B中看到列表的值时,列表的A已经有ID了!!!,因此,在某一点上,B被保存在数据库中,而aList是在级联上完成的。
问题是,我正在从我的控制器在@Service类中调用这个方法,因此我认为,因为事务已经完成,所以Hibernate会检测到对B的更改,并决定持久化这些更改。问题是,如何避免这种行为

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


如果您想避免在某个对象上进行同步,可以在事务提交之前使用
Session.execute(someObject)
方法。

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

我将实体作为逐出添加到会话中,但仍然保留更改。可能是因为我正在执行逐出的实体是一个通过foring键属于另一个实例的实例。我实现了从会话中删除类B,但现在我有一个Hibernate异常org.Hibernate.PersistentObjectException:传递给persistent的分离实体似乎被另一个传递关系引用。您可以在更改B实例之前克隆它,或者尝试在对象图中逐出上游(如果有意义的话)不信任只读标记,请参阅