【问题标题】:Sharing constants between java and databasejava和数据库之间共享常量
【发布时间】:2013-04-10 08:56:07
【问题描述】:

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

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

select * from store where status='OPEN'

现在这不是书面合同,存在很多错误。

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

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

【问题讨论】:

  • 不要将硬编码为“OPEN”,而是将其放入变量中,以将传入的值与数据库中的现有记录进行比较。

标签: java sql database


【解决方案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) 映射策略时的枚举名称)。

【讨论】:

    【解决方案2】:

    使用枚举,可以直接映射到枚举实例名(不需要转换成int序号)

    但在这种情况下,我会有一个名为 open 的布尔/位列,它的可能值是真或假。

    (在大多数数据库中,布尔值是位 0/1)

    【讨论】:

    • 感谢您的回答,但问题不仅仅在于如何处理 java 中的常量,实际上还在于将这些常量与 db 列值同步。
    • @SerkanArıkuşu 是的,我明白了,因此我的建议是直接映射到枚举名称(它在数据库级别上更具描述性),或者在这种特定情况下,重构使用 java 中的布尔值映射到数据库上的位列.
    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 2011-06-30
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多