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

标签 java mysql database enums

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

Java Web 应用程序连接到由 SQL 脚本设置的 MySQL 数据库,JPA/Hibernate 用于 ORM。在此脚本中,我们在“角色”表中插入 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
} ...

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

a) 通过 ID 或姓名更好地检查 b) 使用 String/Long 常量或枚举来检查相等性

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

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

有什么建议吗?

最佳答案

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

我会使用枚举存储 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;
     }
}

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

关于java - 如何在源代码中引用预定义的数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33162955/

相关文章:

php - MySQL JOIN 语句帮助

database - 如何保持 Redis key 的过期时间,即使我设置了一些内容?

mysql - 在 WHERE 子句中使用连接表中的 COUNT

java - ActiveMQ 从 java 中获取正在收听某个主题的消费者数量

mysql - 如何通过代码生成新的主键ID?

java - 如何画圆的半径而不比周长短或大

mysql - 选择从 COUNT() 派生的所有相似的 MAX 值

android - 通过 Shared Preference 从 Sugar ORM 中检索数据

java - 通过将 servlet 传递给 jsp 自动填充值,而不使用 javascript

java - 如何将 System.out、System.err 重定向到日志文件