2014-09-11 66 views
0

我已将装有Eclipse Link的Java实体加载到我的项目中。这是一个简单的关系User - Rol模型,但我不知道为什么它只是不加载用户的Rol列表。集合在Hibernate中未正确加载

这是我生成的代码。由于日志显示正确的查询,甚至显示它加载了rol,但从未出现在用户类上,所以它正在致命中。

@Entity 
@Table(name = "usuario") 
@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u") 
public class Usuario implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private String username; 

    //bi-directional many-to-many association to Rol 
    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
      name = "usuario_has_rol", 
      joinColumns = {@JoinColumn(name = "usuario_username")}, 
      inverseJoinColumns = {@JoinColumn(name = "rol_id_rol")}) 
    private List<Rol> rols; 
    // getters and setters 
} 

的ROL类:

@Entity 
@Table(name = "rol") 
@NamedQuery(name = "Rol.findAll", query = "SELECT r FROM Rol r") 
public class Rol implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id_rol") 
    private int idRol; 

    @Column(name = "rol_name") 
    private String rolName; 

    //bi-directional many-to-one association to RolHasMenu 
    @OneToMany(mappedBy = "rol") 
    private List<RolHasMenu> rolHasMenus; 

    //bi-directional many-to-many association to Usuario 
    @ManyToMany(mappedBy = "rols") 
    private List<Usuario> usuarios; 
    // getters and setters 
} 

日志显示如下(在那里我可以看到ROL正确装入)

21:59:17,112 TRACE EntityReferenceInitializerImpl:245 - hydrating entity state 
21:59:17,112 TRACE EntityReferenceInitializerImpl:297 - Initializing object from ResultSet: [org.inkasoft.edustat.model.Rol#2] 
21:59:17,113 TRACE AbstractEntityPersister:2901 - Hydrating entity: [org.inkasoft.edustat.model.Rol#2] 
21:59:17,113 TRACE BasicExtractor:78 - extracted value ([rol_name2_19_4_] : [VARCHAR]) - [ROL_USER] 
21:59:17,113 TRACE BasicExtractor:78 - extracted value ([usuario_1_24_3_] : [VARCHAR]) - [jaxkodex] 
21:59:17,113 DEBUG CollectionReferenceInitializerImpl:77 - Found row of collection: [org.inkasoft.edustat.model.Usuario.rols#jaxkodex] 
21:59:17,113 TRACE LoadContexts:171 - Constructing collection load context for result set [[email protected]] 
21:59:17,114 TRACE CollectionLoadContext:112 - Starting attempt to find loading collection [[org.inkasoft.edustat.model.Usuario.rols#jaxkodex]] 
21:59:17,114 TRACE CollectionLoadContext:138 - Instantiating new collection [key=jaxkodex, [email protected]] 
21:59:17,114 TRACE BasicExtractor:78 - extracted value ([rol_id_r2_25_3_] : [INTEGER]) - [2] 
+2

你是否得到任何异常?你还需要声明rols的列表类型,例如像这样'private List rols = new ArrayList ();''使用'ArrayList' – Chaitanya 2014-09-11 04:56:52

+0

请添加getters/setters代码。 – 2014-09-11 10:07:28

回答

2

由于@Chaitanya指出,需要指定底层列表实现类的类型,

private List<Rol> rols = new ArrayList<Rol>(); 

另外,在吸气方法

public List<Rol> getRols() { 
    if(rols == null) { 
     rols = new ArrayList<Rol>(); 
    } 
    return rols; 
}