在java和数据库之间共享常量
假设您有一个存储表,其varchar列状态接受值(打开、关闭) 在java方面,尤其是在您的sqls中,我发现自己正在编写这样的查询在java和数据库之间共享常量,java,sql,database,Java,Sql,Database,假设您有一个存储表,其varchar列状态接受值(打开、关闭) 在java方面,尤其是在您的sqls中,我发现自己正在编写这样的查询 select * from store where status='OPEN' 现在这不是一份书面合同,有很多漏洞 我想管理在db端添加新状态或重命名现有状态的情况,并在java端处理它。例如,如果在存储表上,如果所有打开的状态都更改为OP,则我的sql代码将失败 PS:这个问题实际上与编程语言和数据库服务器无关,但我用java标记它,因为我更多地处理它。您的需
select * from store where status='OPEN'
现在这不是一份书面合同,有很多漏洞
我想管理在db端添加新状态或重命名现有状态的情况,并在java端处理它。例如,如果在存储表上,如果所有打开的状态都更改为OP,则我的sql代码将失败
PS:这个问题实际上与编程语言和数据库服务器无关,但我用java标记它,因为我更多地处理它。您的需求有点奇怪。通常情况下,数据库中的内容不会“发生”,您也不必处理它。相反,您决定更改应用程序中的内容,同时更改代码和迁移数据 也就是说,如果要确保数据与已知的一组值一致,可以创建库表。就你而言:
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
然后:
这样,您只需确保lib表始终与代码同步(即,使用JPA的
@Enumerated(EnumType.STRING)
映射策略时,您的枚举名)。使用枚举,您可以直接映射到枚举实例名(无需转换为整数序号)
但在本例中,我将有一个名为open的boolean/bit列,它可能的值是true或false
(布尔值在大多数数据库中为0/1位)不要将硬编码为“OPEN”,而是将其放入变量中,以将传入值与数据库中的现有记录进行比较。感谢您的回答,但问题不仅仅在于如何在java中处理常量,事实上,这是关于将这些常量与db列值同步的。@SerkanArıkuşu是的,因此我理解了我的建议,直接映射到枚举名称(在db级别上更具描述性),或者在这种特定情况下,重构以使用java中映射到db上位列的布尔值。
insert into STORE values ('A') -- fails
insert into LIB_STORE_STATUS values ('A')
insert into STORE values ('A') -- passes