gpt4 book ai didi

java - 自动 hibernate 保存关系

转载 作者:行者123 更新时间:2023-12-02 05:43:50 25 4
gpt4 key购买 nike

基本上我的问题是,为什么我有这样的 Hibernate 关系。

  @OneToMany(cascade = {CascadeType.ALL})
@JoinColumn(name = "candidacy_id", nullable = false)
@XmlElement
@JsonIgnore
@Getter
@Setter
private List<EvaluationSelectionCriteria> evaluationSelectionCriterias = new ArrayList<>();

@ManyToOne
@JoinColumn(name = "candidacy_id", nullable = false, insertable = false, updatable = false)
@XmlTransient
@Getter
@Setter
private Candidacy candidacy;

为什么如果我自动执行此candidacy.setEvaluationSelectionCriteria(list),该列表会保留在数据库中?

我想使用EvaluationSelectionCriteria作为存储库来呈现“ future ”EvaluationSelectionCriteria的列表

可能是因为不懒?

更详细的解释

就像我调用方法a一样,我从数据库实体A获取然后我将列表设置到A中,然后我在方法中返回A,但当我看到值时我没有保存A该列表已经有 id 了!!!

最佳答案

如果您不希望在保存/合并父实体时保存列表,则应删除或限制关系的级联设置:

@OneToMany
private List<EvaluationSelectionCriteria> evaluationSelectionCriterias

@OneToMany(cascade = CascadeType.REMOVE) // or other values from the enum
private List<EvaluationSelectionCriteria> evaluationSelectionCriterias

编辑:如果您想在事务方法中获取实体并对其进行修改,您可以将事务范围限制为仅获取。然后修改事务方法之外的实体。稍后,您可以根据需要合并分离的实体。

由于默认情况下集合属性是惰性的,因此您需要

  • 在事务方法内访问它们的内容 - 因此可以从数据库中获取集合。请注意,您必须在集合上调用一个实际上需要加载其内容的方法,例如 getCriterias().size()

  • 使用LEFT JOIN FETCH加载集合作为查询的副作用。

我不会修改 session 的FlushMode - 虽然这可能会起作用,但感觉就像是一个拼凑 - 它不能很好地传达您的意图。在我看来,显式获取集合并在事务外修改它可以更好地表达您的意图。

关于java - 自动 hibernate 保存关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24287191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com