我的问题是如何在DAO中检索关联数据。
我有3个表:user,role和user_role。 user_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
。 User
具有roles
属性,该属性是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; }
}
现在我正在尝试构建DAO,并对如何填充User
类的角色属性感到困惑。
我认为我需要User
类的这些DAO方法:
1)User getUserMethod1(String userId)
- 从用户表中检索特定user_id的行。不要填充roles
类的User
属性。
2)User getUserMethod2(String userId)
- 从用户表中检索特定user_id的行。同时填充roles
类的User
属性。
3)void updateUser(String userId)
- 更新用户表中特定user_id的行。
4)void deleteUser(String userId)
- 删除用户表中特定user_id的行。
我认为我需要Role
类的这些DAO方法:
1)Role getRole(int roleId)
- 从角色表中检索特定role_id的行。
2)List<Role> getAllRoles()
- 从角色表中检索所有行。
3)void updateRole(int roleId)
- 更新角色表中特定role_id的行。
4)void deleteRole(int roleId)
- 删除角色表中特定role_id的行。
在上述8种DAO方法中,我遇到了User getUserMethod2(String userId)
方法的问题。
我可以从用户表中检索特定user_id的1行;然后从user_role表中检索与该特定user_id相关联的所有role_id。
但是,我是否必须遍历它们并为每个role_id调用Role getRole(int roleId)
类的Role
方法?
如果是,那么我怎样才能掌握该方法?如果不是那么解决方案是什么?
有没有更好的方法来解决此问题,然后为每个role_id调用Role getRole(int roleId)
类的Role
方法?
感谢您阅读此问题。
答案 0 :(得分:0)
如果您已正确设置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:您可以在休眠查询中使用"fetch"
来指定集合的预先加载。
您可以使用条件API或HQL来处理诸如将没有与之关联的角色的用户带入的情况。