从多对多关系中检索数据 - Hibernate
Retrieve data from many-to-many relationship - Hibernate
我有一个 'User' class:
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;
我有一个 'Role' class:
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
int id;
@Column(unique = true)
String role;
关系 :一个用户有角色,角色有用户。我在这里有一个多对多的关系。关系是单向的,我的主导实体是用户。
在我的数据库中有一个名为 "user_roles" 的 table,是自动创建的。我有一个注册了两个角色的用户。
当我使用 "UserDao" class 从数据库中检索用户并尝试访问用户的角色时,出现 NullPointerException。我得到了所有其他信息(姓名、电子邮件等),但我无法访问角色。
我的'UserDao'class:
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());
}
我尝试在 'User' class 中实例化变量 "roles" ,如下所示。但是每次变量 returns size 0:
@ManyToMany
@JoinTable (name = "user_roles", joinColumns=
{ @JoinColumn (name = "user_id")}, inverseJoinColumns=
{ @JoinColumn (name = "role_id")})
private List<Role> regras = new ArrayList<Role>();
我尝试从对象用户获取角色,但在调用方法 size() 时收到 NullPointerException。
List<Role> roles = (List<Role>)user.getRoles();
out.println("size roles: " + roles.size());
我正在尝试访问我的 table 'user_roles' 以从数据库中检索数据,但我无法执行此操作。谁能帮帮我?
提前致谢
您正在使用 SQL 查询来加载用户,并将结果映射到实体。所以你得到的是分离的实体,只包含 SQL 查询返回的内容。
学习使用 JPQL/HQL 和加载实体,然后对其进行管理:
String queryString = "SELECT u FROM User u";
Query consulta = session.createQuery(queryString);
users = (List<User>) consulta.list();
我有一个 'User' class:
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;
我有一个 'Role' class:
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
int id;
@Column(unique = true)
String role;
关系 :一个用户有角色,角色有用户。我在这里有一个多对多的关系。关系是单向的,我的主导实体是用户。
在我的数据库中有一个名为 "user_roles" 的 table,是自动创建的。我有一个注册了两个角色的用户。
当我使用 "UserDao" class 从数据库中检索用户并尝试访问用户的角色时,出现 NullPointerException。我得到了所有其他信息(姓名、电子邮件等),但我无法访问角色。
我的'UserDao'class:
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());
}
我尝试在 'User' class 中实例化变量 "roles" ,如下所示。但是每次变量 returns size 0:
@ManyToMany
@JoinTable (name = "user_roles", joinColumns=
{ @JoinColumn (name = "user_id")}, inverseJoinColumns=
{ @JoinColumn (name = "role_id")})
private List<Role> regras = new ArrayList<Role>();
我尝试从对象用户获取角色,但在调用方法 size() 时收到 NullPointerException。
List<Role> roles = (List<Role>)user.getRoles();
out.println("size roles: " + roles.size());
我正在尝试访问我的 table 'user_roles' 以从数据库中检索数据,但我无法执行此操作。谁能帮帮我?
提前致谢
您正在使用 SQL 查询来加载用户,并将结果映射到实体。所以你得到的是分离的实体,只包含 SQL 查询返回的内容。
学习使用 JPQL/HQL 和加载实体,然后对其进行管理:
String queryString = "SELECT u FROM User u";
Query consulta = session.createQuery(queryString);
users = (List<User>) consulta.list();