【问题标题】:OpenXava populating Collection from databaseOpenXava 从数据库中填充集合
【发布时间】:2023-04-03 10:58:01
【问题描述】:

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

application.xml sn-p:

<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,我会收到一条错误消息 (例如:添加一个新条目): “无法执行保存操作:无法创建:具有该键的对象已存在” + 和以前一样:在保存操作中,getView().getEntity().getCs() 集合为空

【问题讨论】:

    标签: openxava


    【解决方案1】:

    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 映射同一个表,为什么不只使用一个实体?

    【讨论】:

    • 我对我的原始问题添加了一些补充。您对这种情况下的解决方案有任何想法吗?提前谢谢你!
    • 我仍然认为您的实体不适用于 JPA/Hibernate。在没有 OpenXava 的情况下测试您的实体,只需使用带有 main() 的类。使用 JPA 搜索主要实体并获取集合。有用吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多