【发布时间】:2017-09-26 11:58:37
【问题描述】:
在我当前的项目中,我们使用 JSF 2.2、JPA 2(Hibernate 作为持久性提供者)和 Spring Data 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 实例直接存储在支持bean 中。 CarRepository 是一个 Spring Data 存储库。
@Component
@ViewScope
public class CarEditView {
@Getter @Setter
private Integer id;
@Autowired
private CarRepository carRepository;
@Getter
private Car car;
public void load() {
car = carRepository.findOne(id);
}
public void save(){
carRepository.save(car);
}
// ...
Car 实例直接引用并绑定在相关 *.xhtml 文件中的某些 JSF 相关标签中。
但是,Car 实例在第一次请求后被分离。现在让我们考虑在同一个视图中,有一种方法可以将Extra 实例添加到Car 实例。也许现有的也可以修改和删除。
在多个请求之间的同一页面上修改与其他实体有关系的分离 JPA 实体直到它们被显式保存的情况下,JSF 项目遵循的最佳实践是什么?
(请考虑extras是一个惰性集合,所以当这个集合没有被加载和访问时,比方说,在第二次请求中,会抛出异常。但是,保留新/修改/删除列表@ 987654339@ 实例在代码复杂度方面也感觉有点过分。)
【问题讨论】:
-
对哪些开发者隐藏?如果您在“服务层”中进行所有合并,则 ui 开发人员永远不需要知道所有这些......
-
@Kukeltje 感谢您的评论。该问题的目标是与此类场景中的最佳实践相关的答案。最后一句话可能引向了另一个方向,所以我把它删掉了。
-
“最佳实践”问题在 stackoverflow 上并不是很好的问题,因为它们往往是固执己见的。但是imo ...“将其隐藏在服务中”。谷歌一点关于“扩展持久性”“在视图中打开会话”并阅读相关主题......
-
@Kukeltje 相信我,我已经阅读了很多博客文章并且我对 OSIV 模式非常熟悉(至少在 Hibernate 中,但在 Spring 中也有一个
OpenEntityManagerInViewFilter) .但是,与上面的示例相关,这里应该采取什么方法?我应该在支持 bean 中的哪里保留新的/修改的/删除的额外内容,是否真的有必要将这些Extra实例单独保留在一些帮助列表中,或者这甚至已经是扩展持久性上下文的用例? -
好的,那么下次请说明你们都发现了什么,为什么你认为它是好的(或不好的)。当前的问题太开放了。对相关信息等的引用太少(没有)......我个人只是在(帮助)列表中“存储/保留”所有新项目,并在实际需要保存时保存/合并所有项目。有时已经直接作为主/详细信息添加到另一个实体,有时不是。一切都取决于实际用例,
标签: jsf jpa spring-data-jpa jsf-2.2