Java 从多对多关系检索数据-Hibernate

Java 从多对多关系检索数据-Hibernate,java,hibernate,many-to-many,Java,Hibernate,Many To Many,我有一个“用户”类: public class User implements Serializable { @Id @GeneratedValue int id; String nome; @Column(unique = true) String email; @ManyToMany @JoinTable (name = "user_roles", joinColumns= { @JoinColumn (name = "user_id")}, inverseJoinColu

我有一个“用户”类:

public class User implements Serializable { 
@Id 
@GeneratedValue
int id;

String nome;

@Column(unique = true)
String email;

@ManyToMany
@JoinTable (name = "user_roles", joinColumns=
    { @JoinColumn (name = "user_id")}, inverseJoinColumns=
    { @JoinColumn (name = "role_id")})
private List<Role> roles;
关系:用户有角色,角色有用户。我在这里有一种多对多的关系。这种关系是单向的,我的主导实体是用户

在我的数据库中有一个名为“user_roles”的表,它是自动创建的。我有一个注册了两个角色的用户

当我使用“UserDao”类从数据库中检索用户,并尝试访问该用户的角色时,会得到NullPointerException。我获得了所有其他信息(姓名、电子邮件等),但无法访问角色

我的“UserDao”类:

public class UserDaoImpl implements UserDao{

private static final transient Logger log = LoggerFactory.getLogger(UserDaoImpl.class);
private final String HIBERNATE_CFG = "data.cfg.xml";
    @Override
    public int insertUser (User user){
    int code = 0;

    Session session = new HibernateUtil(HIBERNATE_CFG).getSessionFactory().getCurrentSession();
    try {
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();
        code = 1;
    }
    catch (Exception e) {
        log.error(e.getMessage());
        session.getTransaction().rollback();
        code = 0;
    }

    return code;
} 

@Override
public List<User> getAll() {
    Session session = new HibernateUtil(HIBERNATE_CFG).getSessionFactory().getCurrentSession();
    List<User> users = null;

    try
    {
        session.beginTransaction();
        String queryString = "SELECT * FROM USER;";
        SQLQuery consulta = session.createSQLQuery(queryString);
        consulta.setResultTransformer(Transformers.aliasToBean(User.class));
        users = (List<User>) consulta.list();
        session.getTransaction().commit();

    }
    catch(ConstraintViolationException e)
    {
        log.error(e.getMessage());
        session.getTransaction().rollback();
    }
    return users;
}
我试图在“User”类中实例化变量“roles”,如下所示。但每次变量返回大小0时:

@ManyToMany
@JoinTable (name = "user_roles", joinColumns=
{ @JoinColumn (name = "user_id")}, inverseJoinColumns=
{ @JoinColumn (name = "role_id")})
private List<Role> regras = new ArrayList<Role>();
@manytomy
@JoinTable(name=“user\u roles”,JointColumns=
{@JoinColumn(name=“user_id”)},inverseJoinColumns=
{@JoinColumn(name=“role\u id”)}
private List reglas=new ArrayList();
我尝试从Object User获取角色,但在调用方法size()时收到NullPointerException

List<Role> roles = (List<Role>)user.getRoles();
out.println("size roles: "  + roles.size());
List roles=(List)user.getRoles();
out.println(“大小角色:+roles.size());
我正在尝试访问我的表“user\u roles”以从数据库检索数据,但我不能这样做。有人能帮我吗


提前感谢

您正在使用SQL查询加载用户,并将结果映射到实体。因此,您得到的是分离的实体,只包含SQL查询返回的内容

学习使用JPQL/HQL并加载实体,然后对其进行管理:

    String queryString = "SELECT u FROM User u";
    Query consulta = session.createQuery(queryString);
    users = (List<User>) consulta.list();
String queryString=“从用户u中选择u”;
Query consulta=session.createQuery(queryString);
users=(List)consulta.List();

您的映射看起来正常。打开SQL日志记录以查看生成的查询。然后,直接在DB上运行查询,检查它是否返回任何结果。你能发布UserDAO类的代码吗?@predFragmaric他的Hibernate代码充满了问题。请不要发布一切正常的帖子,除非您非常确定确实没有问题。@TimBiegeleisen我指的是
@ManyToMany
映射,这是正常的。他缺少
mappedBy
注释,我相信这会导致问题。当我使用HQL获取列表时,我遇到了这个异常:未能延迟初始化role的集合:User.roles,无法初始化代理-no session查看异常,并了解它的含义以及如何避免它。关于这个例外已经有很多问题了。
List<Role> roles = (List<Role>)user.getRoles();
out.println("size roles: "  + roles.size());
    String queryString = "SELECT u FROM User u";
    Query consulta = session.createQuery(queryString);
    users = (List<User>) consulta.list();