在Hibernate中保存拥有/子对象

时间:2010-06-14 21:42:32

标签: hibernate spring jpa appfuse

我很难在hibernate对象的工作方式中绕过头。这是我的模型的一小部分:

JobOpening:

@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;
}

QuestionSet:

@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;
}

FormQuestion:

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

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

我正在使用Spring(appfuse)中的Hibernate,通常作为分离的对象。

1 个答案:

答案 0 :(得分:0)

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

  • SessionFactory创建Session。通常会为每个线程创建一个新的Session。这在Web上下文中称为每个请求的会话。
  • Hibernate对象(实体)有三种状态 - 持久性分离瞬态

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

  • 需要将分离的对象合并回会话,但必须能够识别其身份 - overriding hashCode() and equals() with a business key.

查看Sessions and transactions documentation