OpenXava从数据库

时间:2016-12-16 10:26:27

标签: openxava

我在填充数据库中的详细信息视图时遇到问题。

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
}

但结果是一样的:子视图(Collection ViewC)的记录是从DB加载的, 并正确显示在屏幕上,但如果我想编辑Collection ViewC,我会收到一条错误消息 (例如:添加新条目): &#34;无法执行保存操作:无法创建:具有该密钥的对象已存在&#34; +和以前一样:在保存操作中,getView()。getEntity()。getCs()集合为空

1 个答案:

答案 0 :(得分: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映射相同的表,为什么不使用一个实体?