我在填充数据库中的详细信息视图时遇到问题。
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()集合为空
答案 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映射相同的表,为什么不使用一个实体?