Java 持久化/保存JPA实体';在实体本身之前的关系

Java 持久化/保存JPA实体';在实体本身之前的关系,java,jpa,spring-mvc,Java,Jpa,Spring Mvc,我有一个@OneToManyJPA协会,有一个课程的实例有几个工作经验的实例 课程JPA实体: @Entity public class Curriculum { ... @OneToMany private Set<WorkExperience> workExperiences; ... @Entity public class WorkExperience { ... 我最初希望将课程及其工作经验保存在persist方法的entityManag

我有一个
@OneToMany
JPA协会,有一个
课程的实例
有几个
工作经验的实例

课程
JPA实体:

@Entity
public class Curriculum {
    ...
    @OneToMany
    private Set<WorkExperience> workExperiences;
    ...
@Entity
public class WorkExperience {
...
我最初希望将课程及其工作经验保存在persist方法的entityManager调用中

但是,考虑到我是如何设计web UI的操作流的,我现在想知道是否可能出现另一种情况,即:

  • 首先将工作经验保存到db,然后在用户填写主课程实体详细信息后保存到:

  • 将现有的WorkExperience实例(已在db中)设置为课程实例(尚未在db中),然后

  • 坚持整个对象图:课程及其工作经验
这有意义吗?我想到了几个缺点,例如,如果用户选择不保留课程实例,会发生什么?如何清理WorkExperience表中的悬挂线


是否有替代方案或更好的模式?例如,在用户验证表单之前预先保存课程实例是一个好主意吗?

我将在
课程上定义一个级联,因为
工作经验
似乎是一个依赖实体

然后在UI/控制器中处理新的/分离的实体,直到用户决定提交(最后一个)表单。然后在同一事务提交期间,持久化
课程
,相关的
工作经验
实体也将持久化

@OneToMany(cascade=CascadeType.ALL)
private Set<WorkExperience> workExperiences;
@OneToMany(cascade=CascadeType.ALL)
私人工作经验;

感谢Kostja的回复。好的,但是在课程最终保存之前,我应该将分离的工作经验实例存储在哪里?@balteo将它们放在分离的课程实体内的
集合中,这样持久化将被级联。我不熟悉SpringMVC,但我假设您的视图有一个实例化的控制器,并且有一个处理表单提交的方法。在持久化之前,我将在该控制器中存储课程实体。对于用户创建新实体的视图,我通常在控制器实例化期间创建一个空实体,对其进行操作,然后在成功提交后保留它。Uhmm。SpringMVC控制器是单例的。把州放在一个单身汉身上不是一个好主意。我曾想过将会话用于存储,但这也不是一个好主意…@balteo Singletons?这使问题变得更为复杂。我认为使用会话范围的bean不是一个坏主意。您可以注入一个会话范围的bean,其中包含课程,如所述。不过,我在Spring细节方面不是一个好的顾问——我的主要专长是使用JPA(与JSF一起使用,其中控制器通常是有状态的),我还以为你的问题主要是关于JPA的。很抱歉,如果我的回答没有什么帮助。@balteo您可以保存一个新的课程实例,并在每次添加新的工作体验时重新蚀刻、更新和合并它。然而,这意味着应用程序实际上是有状态的。通过坚持每次更改,您只需将状态推入数据库。这可能会对性能产生不希望的影响,因此如果可能的话,我更愿意将状态保留在应用程序中,特别是当状态经常更改时。我不确定Spring中是否有中间作用域,比如JSF/CDI中的视图或会话作用域。如果有的话,它显然比会议更可取。