Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java和数据库之间共享常量_Java_Sql_Database - Fatal编程技术网

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

在java和数据库之间共享常量,java,sql,database,Java,Sql,Database,假设您有一个存储表,其varchar列状态接受值(打开、关闭) 在java方面,尤其是在您的sqls中,我发现自己正在编写这样的查询 select * from store where status='OPEN' 现在这不是一份书面合同,有很多漏洞 我想管理在db端添加新状态或重命名现有状态的情况,并在java端处理它。例如,如果在存储表上,如果所有打开的状态都更改为OP,则我的sql代码将失败 PS:这个问题实际上与编程语言和数据库服务器无关,但我用java标记它,因为我更多地处理它。您的需

假设您有一个存储表,其varchar列状态接受值(打开、关闭)

在java方面,尤其是在您的sqls中,我发现自己正在编写这样的查询

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