假设您有一个STORE表,其varchar列STATUS接受值(OPEN,CLOSED)
在java方面,特别是在你的sqls中,我发现自己正在编写像这样的查询
select * from store where status='OPEN'
现在这不是一份书面合同,并且容易受到很多错误的影响。
我想管理在db端添加新状态或重命名现有状态并在java端处理它的情况。例如,如果在STORE表上,如果所有带有OPEN的状态都更改为OP,则我的sql代码将失败。
PS:这个问题实际上是编程语言和数据库服务器无关,但我用java标记它,因为我更多地处理它。答案 0 :(得分:1)
你的需要有点奇怪。通常情况下,东西不仅仅是“发生”在数据库中,而且您不必处理它。相反,您决定更改应用中的内容,同时更改代码并迁移数据。
这就是说,如果要确保数据与众所周知的值集一致,可以创建库表。在你的情况下:
create table STORE (status varchar(32)) -- your table
create table LIB_STORE_STATUS (status varchar(32) unique) -- a lib table for statuses
alter table STORE add constraint FK_STORE_STATUS foreign key (status) references LIB_STORE_STATUS(status) -- constraints the values in your STORE table
然后:
insert into STORE values ('A') -- fails
insert into LIB_STORE_STATUS values ('A')
insert into STORE values ('A') -- passes
有了这个,您只需要确保您的lib表始终与您的代码同步(即使用JPA的@Enumerated(EnumType.STRING)
映射策略时的枚举名称)。
答案 1 :(得分:0)
使用枚举,你可以直接映射到枚举实例名称(不需要转换为int序数)
但在这种情况下,我会有一个名为open的布尔/位列,其可能的值为true或false。
(布尔值在大多数数据库中为0/1位)