提问人:JeroenV 提问时间:8/31/2016 更新时间:8/31/2016 访问量:27
如何实现延迟获取列表与该列表的一个元素的连续获取相结合?
How to implement lazy fetching a list combined with a conditious get for one element of that list?
问:
我们正在为保险箱设置一个带有对象模型的数据库,这些保险箱内部有钞票阅读器来放入钞票。此保险箱存储在 Unit 类中,该单元具有 3 个组件的占位符列表。组件可能会随时间而变化,但占位符将保持连接到同一个保险箱。因此,该单元有 3 个占位符,其标识符为“左阅读器”、“右阅读器”和“打印机”。这种占位符中的实际组件具有产品类型(例如,Mei reader ...或JCM阅读器...和序列号。
现在,由于设备本身将经常从服务器端请求,因为它显示在一个或多个(页面)门户中(查看它自己的序列号、位置、里面有多少钱、允许哪些用户登录这个保险箱等),并且大多数时候我们不需要知道组件,我们希望延迟加载它们。设备本身需要知道它的实际组件(配置)和序列号,以便组件能够在机械师维修期间更换组件时知道/告诉后端。
有一个中间表(占位符组件),其中占位符 FK、组件 FK 和放置的日期时间以及删除的日期时间。
现在有一个 Unit 类,除了许多其他类之外,还包含以下内容:
@OneToMany(mappedBy = "unit", fetch = FetchType.EAGER)
private List<Placeholder> placeholders = new ArrayList<>();
@XmlElementWrapper(name = "Placeholders")
@XmlElement(name = "Placeholder")
public final List<Placeholder> getPlaceholders() {
return placeholders;
}
public final void setPlaceholders(List<Placeholder> pPlaceholders) {
placeholders = pPlaceholders;
}
占位符类具有以下特征:
@OneToMany(mappedBy = "placeholder", fetch = FetchType.LAZY)
private List<PlaceholderComponent> placeholderComponents;
@XmlTransient
public List<PlaceholderComponent> getPlaceholderComponents() {
if (placeholderComponents == null)
placeholderComponents = new ArrayList<PlaceholderComponent>();
return placeholderComponents;
}
public void setOrganizationUnits(List<PlaceholderComponent> pPlaceholderComponents) {
placeholderComponents = pPlaceholderComponents;
}
@XmlElement(name = "Component")
public Component getCurrentComponent() {
if (placeholderComponents == null) {
return null;
} else {
PlaceholderComponent placeComp = placeholderComponents.stream()
.filter(pc -> pc.getDateTimeRemoved() == null)
.findFirst()
.orElse(null);
if (placeComp == null) {
return null;
} else {
return placeComp.getComponent();
}
}
}
在服务中应该有两个可能的调用 getUnit 和 getUnitWithComponents。现在,如果我删除 getCurrentComponent() 上方的 @XmlElement(name = “Component”) 注释并且对 getUnit 调用中的占位符组件不执行任何操作,它会按预期工作,但 getUnitWithComponents 不起作用(它有效,但不返回占位符中的组件)。当我离开注释时,getUnitWithComponents 按预期工作,但 getUnit 给出了一个错误,即无法延迟加载占位符组件,因为显然,JAXB 想要构建 Component 元素,即使整个列表没有在服务中调用,因此没有加载。
我能想到 3 种可能的“解决方案”来解决这个问题:
- 删除 getCurrentComponent 并单独调用以在占位符中检索当前组件,这将发送回单个组件 XML
- 当两个对象都用于同一个数据库表时,为 Placeholder 创建两个不同的对象,使用一个用于 getUnit(其中不存在 Component 注释),另一个用于 getUnitWithComponents(其中存在 Component 注释)。
- 另一种选择是拆分为 DAO 和 DTO,因为可能会有更多这样的情况出现,但这种拆分现在需要相当长的时间。
所以主要问题是:有没有办法在单元XML中获取某些调用的组件,并在大多数调用中将它们排除在外,而没有解决方法?如果没有,您会选择什么解决方案?1、2、3 还是另一个?
答: 暂无答案
评论