在我当前的项目中,我们使用JSF 2.2,JPA 2(Hibernate作为持久性提供者)和Spring Data JPA。在JSF支持bean中有关联的独立JPA实体
的情况是这样的,我试图简化尽可能:我们有一个实体类Car
有双向关系Extra
,一个Car
引用多个Extra
实例。
public class Car {
// ...
@OneToMany(mappedBy = "car", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Extra> extras;
// ...
}
Extra
不仅包含单个String
属性和向后引用Car
。
在用于编辑单辆汽车及其附加件的后台bean中,我们有这样的情况,我们希望将bean的状态保持在视图范围内(对此,我们有一个自定义的@ViewScope
基于Spring的注释,它具有与JEE的@ViewScoped
相同的行为)。
我们采取的方法基本上将Car
实例直接存储在backing bean中。 CarRepository
是一个Spring数据存储库。
的Car
实例被直接引用,并在相关的* .xhtml文件从某些JSF相关的标记约束。
但是,Car
实例在第一个请求后被分离。现在让我们考虑在相同的视图中,有一种方法可以将Extra
实例添加到Car
实例。也许现有的可以修改和删除。
在多个请求之间的相同页面上修改与其他实体之间的关系的分离JPA实体,直到它们被显式保存时,JSF项目遵循的最佳实践是什么? (请考虑extras
是一个懒惰的集合,所以当这个集合没有被加载和访问时,比方说,在第二个请求中,会抛出一个异常。但是,为新的/修改/删除的实例保留列表Extra
实例在代码复杂性方面也感觉有点太多)。
隐藏从哪个开发者?如果你在“服务层”中进行所有合并,UI开发人员永远不需要知道这一切...... – Kukeltje
@Kukeltje感谢您的评论。这个问题的目标是回答这些情况下的最佳实践。最后一句话可能会导致另一个方向,所以我删除了它。 –
'最佳实践'问题在stackoverflow上并不是很好的问题,因为他们倾向于自以为是。但是,imo ...'隐藏在服务中'。谷歌有点'扩展持久性''开放会议在视图中'和阅读相关主题... – Kukeltje