【问题标题】:Retrieve data from many-to-many relationship - Hibernate从多对多关系中检索数据 - Hibernate
【发布时间】:2015-04-30 12:21:19
【问题描述】:

我有一个“用户”类:

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;

我有一个“角色”类:

public class Role implements Serializable {

private static final long serialVersionUID = 1L;

@Id 
@GeneratedValue
int id;

@Column(unique = true)
String role;

关系:用户有角色,角色有用户。我这里有一个多对多的关系。关系是单向的,我的主要实体是用户。

在我的数据库中有一个名为“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;
}

我尝试使用迭代器:

List roles = user.getRegras();
    for (Iterator it = roles.iterator(); it.hasNext();){
        Role r = (Role) it.next();
        out.println("Role:" + r.getRole());
    }

我尝试在“用户”类中实例化变量“角色”,如下所示。但是每次变量返回大小为0:

@ManyToMany
@JoinTable (name = "user_roles", joinColumns=
{ @JoinColumn (name = "user_id")}, inverseJoinColumns=
{ @JoinColumn (name = "role_id")})
private List<Role> regras = new ArrayList<Role>();

我尝试从 Object User 获取角色,但在调用方法 size() 时收到 NullPointerException。

List<Role> roles = (List<Role>)user.getRoles();
out.println("size roles: "  + roles.size());

我正在尝试访问我的表“user_roles”以从数据库中检索数据,但我不能这样做。谁能帮帮我?

提前致谢

【问题讨论】:

  • 您的映射看起来不错。打开 SQL 日志记录以查看生成的查询。然后,直接在 DB 上运行查询以检查它是否返回任何结果。
  • 你能发布 UserDAO 类的代码吗?
  • @PredragMaric 他的 Hibernate 代码充满了问题。请不要发布一切正常,除非您非常确定确实没有问题。
  • @TimBiegeleisen 我指的是@ManyToMany 映射,没关系。
  • 他缺少mappedBy 注释,我相信这会导致问题。

标签: java hibernate many-to-many


【解决方案1】:

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

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

    String queryString = "SELECT u FROM User u";
    Query consulta = session.createQuery(queryString);
    users = (List<User>) consulta.list();

【讨论】:

  • 当我使用 HQL 获取列表时,我得到了这个异常:未能延迟初始化角色集合:User.roles,无法初始化代理 - 没有会话
  • Google 异常,并了解它的含义以及如何避免它。已经有很多关于这个例外的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2017-01-17
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多