2013-04-03 53 views
1

我有@OneToMany JPA与具有WorkExperience的多个实例的Curriculum实例的关联。在该实体本身之前坚持/保存JPA实体的关系

Curriculum JPA实体:

@Entity 
public class Curriculum { 
    ... 
    @OneToMany 
    private Set<WorkExperience> workExperiences; 
    ... 

WorkExperience JPA实体:

@Entity 
public class WorkExperience { 
... 

我本来想与其一起WorkExperiences坚持课程的persist方法之一EntityManager的电话。

然而,鉴于我是如何设计的Web UI的操作流程,我现在想另一种情况是否可能无法即:

  • 坚持的WorkExperiences到数据库,然后再当用户填写的主要课程实体的细节,以:

  • 设置(已在DB)现有WorkExperience实例课程实例(不以dB为单位尚)和

  • 持续整个对象图:课程w^ith工作经验。

这有道理吗?我想到了几个缺点,例如如果用户选择不坚持Curriculum实例会发生什么?如何清理WorkExperience表中的悬挂线?

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

回答

2

我会在Curriculum上定义一个级联,因为WorkExperience似乎是一个依赖实体。

然后在UI /控制器中使用新的/分离的实体,直到用户决定提交(最后一个)表单。然后坚持Curriculum和相关的WorkExperience实体将在相同的事务提交期间保持。

@OneToMany(cascade=CascadeType.ALL) 
private Set<WorkExperience> workExperiences; 
+0

感谢您的回复Kostja。好的,但我在哪里可以在课程最终保存之前存储WorkExperience的独立实例? – balteo

+0

@balteo将它们放入独立课程实体内的'Set'中,所以持久化将被级联。我不熟悉Spring MVC,但是我认为你有一个控制器用于实例化你的视图,并且有一个处理表单提交的方法。这个控制器是我在坚持之前存储课程实体的地方。对于用户创建新实体的视图,我通常在控制器的实例化过程中创建一个空实体,对其进行操作,然后在成功提交后保留它。 – kostja

+0

呃。 Spring MVC控制器是单身人士。将状态置于Singleton中并不是一个好主意。我想过使用会话存储,但它也不是一个好主意...... – balteo