【问题标题】:Saving owned/child objects in Hibernate在 Hibernate 中保存拥有/子对象
【发布时间】:2010-06-14 21:42:32
【问题描述】:

我很难理解休眠对象的工作方式。这是我的模型的一小部分:

职位空缺:

@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(
        name="jobOpening_questionSet",
        joinColumns=@JoinColumn(name="jobOpenings_id"),
        inverseJoinColumns=@JoinColumn(name="questionSets_id")
)
@IndexColumn(name="question_sets_idx",base=0,nullable=false)
public List<QuestionSet> getQuestionSets() {
    return questionSets;
}

问题集:

@ManyToMany(mappedBy="questionSets",fetch=FetchType.EAGER)
public Set<JobOpening> getJobOpenings() {
    return jobOpenings;
}

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@IndexColumn(name="questions_idx",base=0)
@JoinColumn(name="questionset_id",nullable=false)
public List<FormQuestion> getQuestions() {
    return questions;
}

表单问题:

@ManyToOne
@JoinColumn(name="questionset_id", insertable=false, updatable=false, nullable=false)
@OnDelete(action=OnDeleteAction.CASCADE)
public QuestionSet getQuestionSet() {
    return questionSet;
}

现在我将如何着手修改问题集中的问题,或者更改问题集中与哪些工作相关联?例如,要编辑问题集中的问题,我想我应该能够通过其 id 获取问题,更改一些值,然后将其合并(),但这不起作用。

我使用来自 Spring (appfuse) 的 Hibernate,通常作为分离的对象。

【问题讨论】:

  • 您应该尝试添加代码,准确说明您调用的是什么休眠 API,以及何时打开会话与关闭会话。此外,通过“不起作用”,您需要澄清您是否遇到错误,或者它是否默默地无法保存更改。

标签: hibernate spring jpa appfuse


【解决方案1】:

休眠会话的工作方式略有不同:

  • SessionFactory 创建一个Session。大多数情况下,会为每个线程创建一个新的Session。这在网络环境中称为 session-per-request。
  • Hibernate 对象(实体)具有三种状态 - persistentdetachedtransient

    • persistent 表示对象最近已被当前活动会话加载
    • transient 表示对象从未成为会话的一部分
    • detached 表示该对象曾经被加载到会话中,但是会话已经关闭(并且它没有从与之关联的会话中分离
  • 持久对象不需要合并、更新或任何东西 - 每当您更改它们的内部状态时,hibernate 已经知道这一点,它会在下一个 flush()

  • 上创建必要的查询
  • 分离的对象需要重新合并到会话中,但它们的身份必须是可识别的 - 由overriding hashCode() and equals() with a business key.

看看Sessions and transactions documentation

【讨论】:

  • 我想我的问题是,如果我通过添加到其子(或父)列表来修改分离的对象,然后将其合并到会话中,会发生什么?孩子/父母的父母/孩子名单会自动更新吗?还是我必须全部检查并手动修复它们?
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2018-02-10
  • 2015-03-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多