2011-03-07 112 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