Java 如何在DAO中检索关联数据?

Java 如何在DAO中检索关联数据?,java,dao,Java,Dao,我的问题是关于如何在DAO中检索关联数据 我有3个表:user、role和user\u role。用户角色是用户和角色的关联表 create table user (user_id varchar(50) not null primary key, password varchar(50) not null) create table role (role_id int not null primary key, role_name varchar(50) not null) create ta

我的问题是关于如何在DAO中检索关联数据

我有3个表:user、role和user\u role。用户角色是用户和角色的关联表

create table user (user_id varchar(50) not null primary key, password varchar(50) not null)
create table role (role_id int not null primary key, role_name varchar(50) not null)
create table user_role (user_role_id int not null primary key, user_id varchar(50) not null, role_id int not null)
我有两门课:
User
Role
<代码>用户有一个
角色
属性,它是
角色
类型的对象列表

public class User {
   private String userId;
   private String password;
   private List<Role> roles;

   public String getUserId() { return this.userId; }
   public void setUserId(String userId) { this.userId = userId; }
   public String getPassword() { return this.password; }
   public void setPassword(String password) { this.password = password; }
   public List<Role> getRoles() { return this.roles; }
   public void setRoles(List<Role> roles) { this.roles = roles; }
}

public class Role {
   private int roleId;
   private String roleName;

   public int getRoleId() { return this.roleId; }
   public void setRoleId(int roleId) { this.roleId = roleId; }
   public String getRoleName() { return this.roleName; }
   public void setRoleName(String roleName) { this.roleName = roleName; }
}
公共类用户{
私有字符串用户标识;
私有字符串密码;
私有列表角色;
公共字符串getUserId(){返回this.userId;}
public void setUserId(字符串userId){this.userId=userId;}
公共字符串getPassword(){返回this.password;}
public void setPassword(字符串密码){this.password=password;}
public List getRoles(){返回this.roles;}
public void setRoles(列表角色){this.roles=roles;}
}
公共阶级角色{
私人内部控制;
私有字符串roleName;
public int getRoleId(){返回this.roleId;}
public void setRoleId(int-roleId){this.roleId=roleId;}
公共字符串getRoleName(){返回this.roleName;}
public void setRoleName(字符串roleName){this.roleName=roleName;}
}
现在我正在尝试构建DAO,并且对如何填充
User
类的roles属性感到困惑

我想我需要这些DAO方法用于
用户
类:

1)
User getUserMethod1(String userId)
-从用户表中检索特定用户id的行。不要填充
用户
类的
角色
属性。

2)
User getUserMethod2(String userId)
-从用户表中检索特定用户id的一行。同时填充
用户
类的
角色
属性。

3)
void updateUser(字符串userId)
-为特定用户id更新用户表中的一行。

4)
void deleteUser(字符串userId)
-删除用户表中特定用户id的一行

我想我需要这些DAO方法来处理
角色
类:

1)
Role getRole(int-roleId)
-从角色表中检索特定角色id的行。

2)
列出getAllRoles()
-从角色表中检索所有行

3)
void updateRole(int-roleId)
-为特定角色id更新角色表中的一行。

4)
void deleteRole(int-roleId)
-删除角色表中特定角色id的行


在上述8种DAO方法中,我对
User getUserMethod2(String userId)
method存在问题

我可以从用户表中为特定的用户id检索1行;然后从user_role表中检索与该特定user_id关联的所有role_id。 但是,我是否必须遍历它们,并为每个角色id调用
Role getRole(introleid)
方法
Role
类? 如果是,那么我怎样才能掌握这种方法?如果不是,那么解决方案是什么

是否有更好的方法来解决此问题,然后为每个角色id调用
Role
类的
Role getRole(int-roleId)
方法


谢谢你阅读这个问题

如果已正确设置hibernate.cfg,则必须具有一对多关联才能在用户类中关联集合

        <set name="role" table="role" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="role_id" />
            </key>
            <one-to-many class="com.model.Role" />
        </set>

无论如何,如果操作正确,您可以启用延迟加载,使其不带集,只在尝试访问集时带集。请注意,您必须保持会话打开,以便延迟加载才能工作

对于问题2:您可以在hibernate查询中使用
“fetch”
来指定集合的即时加载


您可以使用criteria API或HQL来处理这样的情况,例如将没有关联角色的用户带来。

您可以执行一次查询来检索每个用户的所有角色,然后通过循环查询结果来清除数据并将所有必要的角色分配给Java中的用户。因此,您建议使用
用户getUserMethod2(字符串userId)
方法应该自己创建每个
角色
对象,并且不要调用
角色getRole(int-roleId)
方法?是从查询结果创建角色并将其分配给适当的用户。按用户对查询结果排序以便于数据清理。但这是否意味着创建
Role
对象的逻辑在
user-getUserMethod2(String-userId)
Role-getRole(int-roleId)
方法中是相同的?我假设您不再需要
getRole()
,只需要
getUser()
因为当调用
getUser
时,可以清除查询结果并在该方法中分配角色。是的,您必须在
getUser
中创建
角色
,谢谢@Rash。但是我没有在这个项目中使用Hibernate。