- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个user
数据库表:
CREATE TABLE IF NOT EXISTS `user` (
`user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`first_ name` VARCHAR(45) NOT NULL,
`active_status` ENUM('ACTIVE', 'PENDING', 'DEACTIVATED', 'BLOCKED', 'SPAM', 'DELETED') NOT NULL ,
UNIQUE INDEX `unique_id_UNIQUE` (`unique_id` ASC),
UNIQUE INDEX `email_UNIQUE` (`email` ASC),
PRIMARY KEY (`user_id`))
ENGINE = InnoDB;
我将其映射到相应的 JPA 实体类:
@Entity
public class User implements OfloyEntity {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id", unique = true, nullable = false)
private int userId;
//other fields
@Enumerated(EnumType.STRING)
@Column(name = "active_status", nullable = false, length = 11)
private UserStatus activeStatus;
如您所见,我已将 activeStatus
映射到 enum UserStatus
以限制持久层本身的整体。
public enum UserStatus {
ACTIVE,
PENDING,
DEACTIVATED,
BLOCKED,
DELETED,
SPAM
}
我想知道使用这种方法在持久层中实现数据库枚举有什么缺点吗?我抛出了多篇推荐使用 AttributeConverter 的文章但由于我的枚举中的值非常有限并且修改的机会较小,因此我无法将所有这些文章与我的要求联系起来。
我的设计有什么遗漏或者可以改进的地方吗?
我扔掉的文章:
vladmihalcea
thorban以及其他一些 stackoverflow 问题。
更新:阅读 Jens 的答案后,我决定实现 AttributeConverter
(针对用户的性别
)。这让我有点困惑:
为什么我决定使用枚举作为 MYSQL 列类型:因为它限制了值并且需要更少的空间。因为 MYSQL 在幕后存储其枚举的序数值,并且当询问该值时,它表示该值的字符串值,因此节省了空间。
我对性别的实现:
public enum UserGender {
MALE('M'),
FEMALE('F'),
OTHER('O');
private Character shortName;
private UserGender(Character shortName) {
this.shortName = shortName;
}
public Character getShortName() {
return shortName;
}
public static UserGender fromShortName(Character shortName) {
switch (shortName) {
case 'M': return UserGender.MALE;
case 'F' : return UserGender.FEMALE;
case 'O' : return UserGender.OTHER;
default:
throw new UserGenderNotSupportedException("user gender with shortName : " + shortName + " not supported");
}
}
}
转换器类:
@Converter(autoApply = true)
public class UserGenderConverter implements AttributeConverter<UserGender, Character> {
@Override
public Character convertToDatabaseColumn(UserGender userGender) {
return userGender.getShortName();
}
@Override
public UserGender convertToEntityAttribute(Character dbGender) {
return UserGender.fromShortName(dbGender);
}
}
现在,主要疑问:
1.根据博客,在数据库中使用 MYSQL enum 是邪恶的,因为有一天如果我需要向枚举列添加额外的值,这将需要表 ALTER,但情况不是一样吗使用AttributeConverter
?因为我们还使用了 java enum
,如果有一天需要新的性别,则需要更改它?
2.如果我使用AttributeConverter
,我必须在某处记录javaenum
(这里UserGender
)解释,以便DBA能够理解什么是F,M ,O 代表。我在这儿吗?
最佳答案
这些文章为您提供了丰富的潜在缺点选择:
使用@Enumerated(EnumType.STRING)
具有以下内容:
如果您不处理大量数据,而更新所有行的列是一个实际问题,那么我不会担心。当简单的解决方案实际上成为问题时,引入 AttributeConverter
并更新数据是很容易的。
我不相信任何东西都是“邪恶的”,因为它可能需要 ALTER TABLE
语句。根据这个论点,我们应该完全废除关系数据库,因为使用它们需要 DDL,并且应用程序的发展将需要更多 DDL。当然,DDL 语句的必要性使得部署变得更加复杂。但无论如何你都需要能够处理这件事。
但是,在这种情况下,使用 AttributeConverter 确实不需要任何 DDL,因为您只需将另一个值放入同一列中,该列没有任何特殊约束,除了值的最大长度。这假设您没有对该列进行检查约束来限制合法值。
Enum
与数据库中存储的值之间的关系?取决于你的团队。 DBA 关心数据的含义吗? DBA 是否有能力理解 Java 代码?如果 DBA 需要或想要知道但不能或不会从源代码中获取信息,则必须将其记录下来。确实如此。关于mysql : why would I require AttributeConverter over enum to map a DB column having enum datatype as enum with a JPA entity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51065625/
我不明白为什么这甚至可以编译。我尝试过不同的格式,它们似乎都有效。 为什么有一个 enum of enum of enum of.. 是合法的? interface I { enum E im
我有大型数据库(数百万行),我正在尝试为 2 个字段的数据类型做出最佳选择。我制作的大部分内容都是 varchar 或 INT。但是,我想知道 Enum 是否是最好的方法的 2 个字段。 字段 1第一
我是 C++ 新手,我想知道是否有人可以帮助我理解原因 enum difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE }; difficulty m
从 native 代码强制转换(在 C++/CLI 中)的正确方法是什么 enum到托管代码enum其中包含相同的 enum值(value)观?与使用 C# 的强制转换方式有什么区别,例如 (int)
我有以下枚举 [Flags] public enum WeekDays { Monday = 1, Tuesday = 2, Wednesday = 4, Thursd
我刚刚学习 Java 中的枚举。当我运行下面的代码时,我收到一个错误,我也在下面重现该错误。基本上,我的问题是:当我在枚举中定义一个方法,并且在该方法中我想检查枚举的值以便我可以根据该值执行某些操作时
我想要一些语法糖来打开 Enum .当然,一个if else块按预期工作: @enum Fruit apple=1 orange=2 kiwi=3 function talk1(fruit::Frui
我试图在 Enum.each 的函数内为变量设置一个值,但在循环结束时,变量为空,我不知道为什么会出现这种行为。 代码: base = "master" candidates = ["stream",
This question already has answers here: Is there a way to use existing structs as enum variants? (2个
我想让 Java 中的枚举器具有其他枚举作为属性。 public enum Direction { Up(Down), Down(Up), Left(Right), R
我有一个包含两种不同可能“类型”的枚举和一个可以返回其中任何一种的函数,封装在 Option 中: enum Possibilities { First(i32), Second(St
我刚刚注意到 pyhton 中 Enum+defaultdict 的一个非常奇怪的行为。我定义了一个这样的枚举,它收集了一些默认词典: from enum import Enum from colle
我想在运行时从配置文件生成一些类型。为简单起见,假设我已经将数据加载为 Python 字典: color_values = dict(RED = 1, YELLOW = 2, GREEN = 3) 我
我想创建一个方法,在传入参数的任何枚举类上实现 valueOf(并包装一些专门的错误/缺失名称代码)。所以基本上,我有几个枚举,例如: enum Enum1{ A, B, C } enum Enum2
我有一个user数据库表: CREATE TABLE IF NOT EXISTS `user` ( `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
这是我的 JPA @Repository,在这里我们可以得到 list与 findByFullNameContaining(String query) - 通过在查询中提供 fullName 的子字符
(也在这里打开了一个问题:https://github.com/square/moshi/issues/768 但被要求打开一个stackoverflow问题)我正在编写一个通用适配器来转换带有枚举值
请帮助找到以下情况的最佳方法: 有一个表,大约有 20 列。 每列都有自己的短名称、全名称和类型(数字或字符串)。 每个列类型都可以有自己的运算符 - 例如,字符串 - 包含、等于;数字 - 更多、更
如果我在 python 中按功能创建了 enum.Enum(本例中为 3.7),如何从中检索类的名称? import enum def print_the_enum_class_name(some_e
我正在编写一个与第 3 方程序交互的程序。这个第 3 方程序允许用户制作可以运行在第 3 方程序中进行的步骤记录的按钮。 但! 这些按钮还可以运行用户定义的批处理文件。因此,我使用此功能通过创建文件并
我是一名优秀的程序员,十分优秀!