Java 如何在DAO中检索关联数据?
我的问题是关于如何在DAO中检索关联数据 我有3个表:user、role和user\u role。用户角色是用户和角色的关联表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
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。