如何实现延迟获取列表以及该列表中一个元素的conditious get?

时间:2016-08-31 10:15:50

标签: java jpa jaxb

我们正在设置一个带有保险柜对象模型的数据库,这些保险柜里面有账单读取器,用于存入账单。这个保险柜存储在Unit类中,该单元有一个占位符列表,用于&#39 ;比方说,3个组成部分。组件可以随时间变化,但占位符将保持连接到同一个保险箱。所以这个单元有3个占位符,标识符如“左读者”,“右读者”和“#39;和'打印机'。这样一个占位符中的实际组件具有产品类型(例如Mei reader ...或JCM reader ...)和序列号。

现在,由于在一个或多个(页面)门户中显示单元本身,因此它将经常从服务器端请求(要查看它自己的序列号,位置,内部有多少钱) ,允许用户登录到这个保险箱等,并且大多数时候我们不想知道组件是否懒得加载它们。设备本身需要知道它的实际组件(配置)和序列号,以便组件能够在机械师维修期间更换组件时知道/告知后端。

有一个中间表(占位符组件),占位符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&amp; getUnitWithComponents。现在,如果我删除getCurrentComponent()上面的@XmlElement(name =&#34; Component&#34;)注释,并且对getUnit调用中的placeholderComponents不执行任何操作,它会按预期工作,但getUnitWithComponents不起作用(它有效,但不会返回占位符内的组件。当我离开注释时,getUnitWithComponents按预期工作,但是getUnit给出了一个错误,即无法懒惰地加载占位符组件,显然,JAXB想要构建Component元素,即使整个列表没有在服务中调用,因此没有加载。

我可以想到3种可能的解决方案&#39;解决这个问题:

  1. 删除getCurrentComponent并单独调用以检索占位符中的当前组件,该占位符将发回单个组件XML
  2. 为Placeholder创建两个不同的对象,同时两个对象用于同一个DB表,使用getUnit(其中Component注释不存在),另一个用于getUnitWithComponents(其中存在Component注释)。
  3. 另一种选择是分成DAO和DTO,因为可能会有更多的情况发生,但这种分裂现在需要相当长的时间。
  4. 所以主要的问题是:有没有办法让单元格中的组件用于某些调用,并且在没有解决方法的情况下将它们留给大多数调用?如果没有,你会选择什么解决方案? 1,2,3或另一个?

0 个答案:

没有答案