2011-03-07 155 views
2

我和JPA很難過,希望有人能幫助我。雙向多對多JPA

我有3個表:

  • ROL(CPE_ROL)
  • TipoUsuario(GTV_TIPOUSU)
  • RolTipoUsuario(CPE_ROLTUS - 加入表)

Rol.java

@JoinTable(name = "CPE_ROLTUS", joinColumns = { 
    @JoinColumn(name = "CPE_ROLTUS_TIPOUSU_ID", referencedColumnName = "GTV_TIPOUSU_ID")}, inverseJoinColumns = { 
    @JoinColumn(name = "CPE_ROLTUS_ROL_ID", referencedColumnName = "CPE_ROL_ID")}) 
@ManyToMany(fetch = FetchType.LAZY, cascade={CascadeType.REFRESH}) 
private List<TipoUsuario> tipoUsuarioList; 

TipoUsuario.java

@ManyToMany(mappedBy = "tipoUsuarioList", fetch = FetchType.LAZY, cascade={CascadeType.REFRESH}) 


private List<Rol> rolesDefault; 

由於某種原因,rolesDefault從來沒有被填滿,我想知道如果我失去了一些東西。

在此先感謝。

丹尼爾

+0

您是否嘗試過將其設置爲急切獲取,或者在查詢時將其包含在提取語句中? – Steven 2011-03-07 22:56:16

+0

是的,我嘗試了兩個,似乎沒有人工作。 – zkropotkine 2011-03-07 23:09:03

回答

5

我的猜測是,當你創建你是不是設置關係的雙方的對象。您必須在JPA中保持雙向關係。當你添加到一邊時,也添加到另一邊。

見, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

你最有可能啓用高速緩存,或使用相同的EntityManager,所以閱讀當你從緩存中的對象。您也可以禁用共享緩存,或刷新對象,但修復持久代碼是最好的。

否則,啓用最好的日誌記錄並查看執行了哪些SQL。

+0

是的,我正在使用相同的EntityManager ...我用nativeQuery完成了此操作。我知道這不是最好的解決方案,但它是我發現的最簡單,最快速的解決方案。 – zkropotkine 2011-03-18 17:54:02