如何在不支持枚举的数据库中实现枚举域?(即SQLite)
这些字段需要易于使用"field
= ?“进行搜索。因此,使用任何类型的数据序列化都不是一个好主意。
发布于 2009-04-17 17:15:03
为了限制可能的值,我将使用包含枚举项的表的外键。
如果您不想使用JOIN进行搜索,则将键设置为varchar,如果join不是问题,则将key设置为INT,除非需要在该字段上进行搜索,否则不要连接。
请注意,将枚举放入DB中会阻止对代码中的值进行编译时检查(除非在代码中复制枚举)。我发现这是一个很大的缺点。
发布于 2009-04-17 17:25:04
这就是我最近所做的
在我的hibernate映射POJO- I中,成员的类型保持为String,在数据库中为VARCHAR。
这里的setter方法接受一个枚举,还有另一个setter方法接受字符串--但这是私有的(或者你可以直接映射字段-如果你喜欢的话)。
现在我使用的字符串已经被全部封装了。对于应用程序的其余部分-我的域对象使用枚举。就数据库而言,我使用的是字符串。
如果我没听懂你的问题-我道歉。
发布于 2021-02-11 21:08:31
如果将Spring JPA2.1或更高版本与hibernate结合使用,则可以实现自己的AttributeConverter并定义枚举映射到列值的方式
@Converter(autoApply = true)
public class CategoryConverter implements AttributeConverter<Category, String> {
@Override
public String convertToDatabaseColumn(Category category) {
if (category == null) {
return null;
}
return category.getCode();
}
@Override
public Category convertToEntityAttribute(String code) {
if (code == null) {
return null;
}
return Stream.of(Category.values())
.filter(c -> c.getCode().equals(code))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
请参阅Persisting Enums in JPA上文章中的第四个解决方案.The代码片段也来自那里。
https://stackoverflow.com/questions/761211
复制相似问题