0

値 (OPEN、CLOSED) を受け入れる varchar 列 STATUS を持つ STORE テーブルがあるとします。

Java側、特にあなたのSQLでは、このようなクエリを書いていることに気づきました

select * from store where status='OPEN'

現在、これは書面による契約ではなく、多くのバグにさらされています。

データベース側で新しいステータスが追加された場合や既存のステータスが名前変更された場合を管理し、Java 側で処理したいと考えています。たとえば、STORE テーブルで OPEN のすべてのステータスが OP に変更された場合、SQL コードは失敗します。

PS:この質問は、実際にはプログラミング言語とデータベース サーバーに依存しませんが、私はより多くのことを扱うので、Java でタグ付けします。

4

2 に答える 2

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)マッピング戦略を使用する場合の列挙名)。

于 2013-04-10T09:43:58.013 に答える
0

列挙型を使用すると、列挙型インスタンス名に直接マップできます (int 序数に変換する必要はありません)。

しかし、この場合、open と呼ばれる boolean/bit 列があり、可能な値は true または false になります。

(ブール値は、ほとんどの DB でビット 0/1 です)

于 2013-04-10T09:49:19.687 に答える