在java和数据库之间共享常量

时间:2013-04-10 08:56:08

标签: java sql database

假设您有一个STORE表,其varchar列STATUS接受值(OPEN,CLOSED)

在java方面,特别是在你的sqls中,我发现自己正在编写像这样的查询

select * from store where status='OPEN'

现在这不是一份书面合同,并且容易受到很多错误的影响。

我想管理在db端添加新状态或重命名现有状态并在java端处理它的情况。例如,如果在STORE表上,如果所有带有OPEN的状态都更改为OP,则我的sql代码将失败。

PS:这个问题实际上是编程语言和数据库服务器无关,但我用java标记它,因为我更多地处理它。

2 个答案:

答案 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位)