我们公司讨论过如何在我们的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/