【发布时间】:2015-04-25 16:25:16
【问题描述】:
如何判断关联表是否需要单独的实体和DAO?
假设我有 3 个表:user、role 和 user_role。 user_role 是关联表。
create table user (user_id int not null primary key, login varchar(50) not null unique key, password varchar(100))
create table role (role_id int not null primary key, description varchar(100))
create table user_role (user_role_id int not null identity(1,1) primary key, user_id int not null foreign key references user(user_id), role_id int not null foreign key references role(role_id))
现在我将为 user 和 role 表创建单独的实体和 DAO。
public class User {
private int userId;
private String login;
private String password;
// getters and setters
}
public interface UserDAO {
User getUserById(int userId);
void insertUser(User user);
void updateUserById(User user);
void deleteUserById(User user);
}
public class Role {
private int roleId;
private String description;
// getters and setters
}
public interface RoleDAO {
User getRoleById(int roleId);
void insertRole(Role role);
void updateRoleById(Role role);
void deleteRoleById(Role role);
}
我将有 3 个屏幕:
屏幕 1: 我将有一个屏幕来维护
user表上的 CRUD 操作。屏幕 2:我将有一个屏幕来维护
role表上的 CRUD 操作。屏幕 3: 我将有一个屏幕,用户将在其中分配角色。
但我对如何处理 user_role 表感到困惑。
a) User 实体是否应该有一个关联的Role 列表。这样就够了吗?
public class User {
private int userId;
private String login;
private String password;
private Set<Role> roles;
// getters and setters
}
b) Role 实体是否应该有一个关联的User 列表。这样就够了吗?
public class Role {
private int roleId;
private String description;
private Set<User> users;
// getters and setters
}
c) 我是否应该为 user_role 表设置一个单独的实体和 DAO,如下所示:
public class UserRole {
private int userRoleId;
private User user;
private Role role;
}
public interface UserRoleDAO {
User getUserRoleById(int userRoleId);
void insertUserRole(UserRole userRole);
void updateUserRoleById(UserRole userRole);
void deleteUserRoleById(UserRole userRole);
}
【问题讨论】:
-
考虑引用
Role对象:您认为您是否必须从这样的角色对象导航到具有该角色的用户(作为您业务逻辑的一部分)?如果有,多久一次?在大多数情况下,您不会。这就是为什么通常不需要Role类中的Set<User>的原因。 -
这一切都是您手动完成的吗?这似乎是连接表的理想选择,而 JPA(/Hibernate) 使它变得容易。
-
@Seelenvirtuose 你是对的。我在
Role中不需要Set<User>。UserRole呢?需要吗? -
@chrylis 是的,我正在手工完成所有这些工作。没有真正的 JPA 经验,所以不知道如何使用 JPA 处理它。你认为我去 JPA 会更好吗?
-
我强烈建议不要手动滚动您自己的 DAO。如果您使用的是 SQL 数据库,JPA 是您的最佳选择,我个人在我的数据存储(现在是 MongoDB)之上使用 Spring Data 存储库。
标签: java associations