【问题标题】:Automatically hibernate save relationship自动休眠保存关系
【发布时间】:2014-06-18 13:42:01
【问题描述】:

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

  @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 作为存储库来呈现“未来”EvaluationSelectionCriteria 列表

可能是因为不是懒惰?

更详细的解释

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

【问题讨论】:

    标签: java spring hibernate jakarta-ee


    【解决方案1】:

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

    @OneToMany
    private List<EvaluationSelectionCriteria> evaluationSelectionCriterias
    

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

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

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

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

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

    我不会修改会话的FlushMode - 虽然这可能会起作用,但感觉就像一个杂物 - 它不能很好地传达您的意图。显式获取集合并在事务之外对其进行修改可以更好地表达您的意图 IMO。

    【讨论】:

    • 我的猜测是列表的内容应该只按需保存到数据库中。如果没有级联,OP 必须先保存列表的元素。
    • 不,不,那部分很清楚。这里奇怪的是我没有保存实体。我只是将列表设置到实体中,然后返回实体,但我没有保存。唯一的问题是我的整个服务都是事务性的,但在任何时候我都在保存实体。所以就像我调用方法a一样,我从数据库实体A获取然后我将一个列表设置为A然后我在方法中返回A但是我没有保存A,当我已经看到列表的值时有身份证!!!
    • 将会话的刷新模式设置为手动应该避免列表 sessionFactory.getCurrentSession().setFlushMode(FlushMode.MANUAL); 的自动持久化
    • 啊,好吧 - 我似乎更了解您的要求。您发布的代码意味着您的实体 (A) 和 EvaluationSelectionCriteria 之间存在一个连接表,因为关系映射上没有 mappedBy 属性。这个对吗?您是否引用了 EvaluationSelectionCriteria 中的 A?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多