2016-12-16 97 views
0

我從數據庫填充詳細視圖時遇到問題。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()集合爲null。 我需要做些什麼才能使視圖與後面的實體相對應?

我正在使用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)的記錄裝從數據庫 正確顯示在屏幕上,但如果要編輯Collection ViewC (例如:添加新條目),我會收到一條錯誤消息: 「無法執行保存操作:無法創建:對象該鍵已經存在「 +與之前一樣:在保存操作中,getView()。ge tEntity()。getCs()集合爲null

回答

0

OpenXava使用JPQL獲取集合數據,而不是僅調用集合getter,這是爲了允許篩選和排序。這裏的問題是由OpenXava生成的查詢語句獲取數據,但不是JPA實體的getter。當然JPA/Hibernate並不是很滿意用mappedyBy來引用另一個類型。這是你寫的:

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

凡是一個參考,而不是B. 假設A和B映射同桌,爲什麼不能只使用一個實體?

+0

我在原來的問題中增加了一些補充。在這種情況下,你有任何想法解決方案嗎?先謝謝你! – SzGyD

+0

我仍然認爲你的內容不適合JPA/Hibernate。在沒有OpenXava的情況下測試你的實體,只需要一個帶有main()的類。使用JPA搜索主實體並獲取集合。它工作嗎? – javierpaniza