如何在源代码中引用预定义的数据库条目

Rap*_*oth 5 java mysql database enums

我们公司讨论了如何在我们的java源代码中引用某些数据库条目。 情况如下:

java Web 应用程序连接到由 SQL 脚本设置的 MySQL 数据库,JPA/Hibernate 用于 ORM。在这个脚本中,我们在“roles”表中插入了 3 个角色(即用户可以在 Web 应用程序中拥有的角色,即用户表具有角色表的外键)。这些角色具有 SQL 脚本中给出的预定义主键/ID (BIGINT) 和名称 (VARCHAR)。这些角色不用于安全框架,而是用于业务逻辑。目前它看起来像这样:

if(user.getRole.getId()==1) {
     // user is in role A
} else if(user.getRole().getId()==2) {
    // user is in role B
} ...
Run Code Online (Sandbox Code Playgroud)

由于角色必须在编译时由源代码知道(因为逻辑取决于它们),我们必须检查用户是否具有某些角色。现在的问题是如何做到这一点。我们讨论过:

a) 通过 ID 或名称更好地检查 b) 使用字符串/长常量或枚举来检查相等性

a) 我更喜欢检查 ID(因为它不太可能改变,因为我们在数据库设置时使用脚本插入 ID),角色名称更有可能在应用程序的生命周期内改变。

b) 我更喜欢使用常量,因为我不喜欢依赖枚举索引/序数。此外,我们在这里不需要类型安全。我在枚举中看到的唯一优点是它很容易获取所有值,afaik 只有在常量的情况下才有可能通过反射。但是由于我们在数据库上定义了所有角色,因此可以在运行时从那里获取它们。

有什么建议?

flo*_*flo 4

按照您的方法,在编译时需要角色,因此从数据库中获取它们没有帮助。

我会使用枚举来存储 id:

public enum Role {
     ROLE1(1), ROLE2(2), ROLE(3);

     private final int id;
     private Role(int id) {
         this.id=id;
     }

     public int getId() {
          return this.id;
     }
}
Run Code Online (Sandbox Code Playgroud)

如果您想将它们与数据库条目进行匹配(例如,获取一些额外的元数据),您已经存储了匹配的 ID。这使您能够从数据库角色转换为枚举角色,反之亦然。