【问题标题】:How to decide if a separate entity and DAO is needed for an association table?如何确定关联表是否需要单独的实体和 DAO?
【发布时间】:2015-04-25 16:25:16
【问题描述】:

如何判断关联表是否需要单独的实体和DAO?

假设我有 3 个表:userroleuser_roleuser_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))

现在我将为 userrole 表创建单独的实体和 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&lt;User&gt; 的原因。
  • 这一切都是您手动完成的吗?这似乎是连接表的理想选择,而 JPA(/Hibernate) 使它变得容易。
  • @Seelenvirtuose 你是对的。我在Role 中不需要Set&lt;User&gt;UserRole 呢?需要吗?
  • @chrylis 是的,我正在手工完成所有这些工作。没有真正的 JPA 经验,所以不知道如何使用 JPA 处理它。你认为我去 JPA 会更好吗?
  • 我强烈建议不要手动滚动您自己的 DAO。如果您使用的是 SQL 数据库,JPA 是您的最佳选择,我个人在我的数据存储(现在是 MongoDB)之上使用 Spring Data 存储库。

标签: java associations


【解决方案1】:

我想这是用户和角色之间的双向关系,您应该在 User.java 中拥有一组角色,在 Roles.java 中拥有一组用户。绝对需要一个单独的实体 user_roles。如果您有用户的 dao,您可以在 userdao 中使用以下方法

 User getUserRoleById(int userRoleId);
 void insertUserRole(UserRole userRole);
 void updateUserRoleById(UserRole userRole);
 void deleteUserRoleById(UserRole userRole);

【讨论】:

  • 我不确定是不是双向关系。我很可能永远不需要显示属于某个角色的用户。但是当我删除一个角色时,我需要首先检查该角色是否有关联的用户(在user_role 表中);如果有关联的用户,那么我需要给出一条错误消息,说明有用户与此角色关联,因此无法删除此角色。
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 2021-12-19
  • 2023-02-21
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多