0

我在从数据库填充详细视图时遇到问题。

application.xml 片段:

<module name="ModuleB">
        <model name="B"/>
        <view name="ViewB"/>
        ...
        <mode-controller name="DetailOnly"/>
</module>

我有三个实体类:

@Entity
@Table(name="A")
class A {
    @OneToMany(mappedBy = "a")
    @ListProperties("col1")
    @CollectionView("cs")
    private Collection<C> cs;//+getter/setters
}

@Entity
@Table(name="A")
@View(name = "ViewB", ...)
class B {
    @OneToMany(mappedBy = "a")
    @ListProperties(...)
    @CollectionView("ViewC")
    private Collection<C> cs;//+getter/setters
}

@Entity
@Table(name="C")
@View(name = "ViewC", ...)
class C {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private A a;
}

我想通过单击链接从数据库中读取现有的 B 实例,然后对其进行编辑/修改。当我使用 getView().setModel() 甚至使用 getView().findObject() 设置视图的模型对象时,屏幕上的一切看起来都很好,集合显示了其正确的内容。另一方面,当我尝试将其保存回来时,在保存操作中 getView().getEntity().getCs() 集合为空。我该怎么做才能使视图与背后的实体相对应?

我正在使用 OpenXava 5.0.1、java 1.7 重要提示:我不允许更改 OpenXava 版本,因为它是一个遗留项目。

我的编辑 (20170126) 我创建了一个新类以避免引用问题:

@Entity
@Table(name="C")
@View(name = "ViewC", ...)
class D {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private B a;
}

and modified the class B accordingly:

@Entity
@Table(name="A")
@View(name = "ViewB", ...)
class B {
    @OneToMany(mappedBy = "a")
    @ListProperties(...)
    @CollectionView("ViewC")
    private Collection<D> cs;//+getter/setters
}

但结果是一样的:子视图(集合 ViewC)的记录是从数据库中加载的,并正确显示在屏幕上,但是如果我想编辑集合 ViewC(例如:添加一个新条目),我会收到一条错误消息):“无法执行保存操作:无法创建:具有该键的对象已存在” + 与以前一样:在保存操作中,getView().getEntity().getCs() 集合为空

4

1 回答 1

0

OpenXava 使用 JPQL 来获取集合数据,而不是仅仅调用集合 getter,这是为了允许过滤和排序。这里的问题是 OpenXava 生成的查询语句获取了数据,但 JPA 实体的 getter 没有。当然,JPA/Hibernate 对映射到另一种类型的引用不是很满意。那就是你写:

class B {
  @OneToMany(mappedBy = "a")
  @ListProperties(...)
  @CollectionView("ViewC")
  private Collection<C> cs;//+getter/setters
}

其中 a 是对 A 的引用,而不是对 B 的引用。鉴于 A 和 B 映射同一个表,为什么不只使用一个实体呢?

于 2016-12-19T13:16:45.457 回答