2016-08-05 3 views
2

У меня есть следующий класс в моей программе, я хочу, чтобы этот класс хранился в базе данных Oracle 12c, я знаю, как хранить большую часть информации, но как хранить пользовательский тип, который типа enum? я следующая схема для модели данных:Как сохранить объект с полем перечисления в базе данных оракула

here should be picture

и это му классу пользователя

public class User { 

    @Id 
    protected Identity<User> id; 

    protected String identifier; 

    protected UserType type; 

    protected String password; 

    public static enum UserType { 
     CUSTOMER, COURIER; 
    } 

} 
+0

Вы действительно мужчина [объект] (http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjint.htm#ADOBJ001); или вы хотите, чтобы ваша таблица пользователя имела столбец типа 'type', который ограничен этими двумя значениями; или у вас есть другая таблица, которая содержит эти два значения (но может добавить другие), и вам нужна ссылочная целостность между ними? –

+0

отредактировал вопрос, чтобы указать мою проблему –

ответ

3

С только два фиксированных значений, самый простой способ с a check constraint:

create table users (
    id number primary key, 
    identifier varchar2(30), 
    password raw(64), 
    type varchar2(8) not null check (type in ('CUSTOMER', 'COURIER')) 
); 

check (type in ('CUSTOMER', 'COURIER')) довольно понятен; Oracle проверяет, что значение, указанное для этого столбца, является одним из этих двух значений. Предполагая, что вы хотите, чтобы он всегда был установлен, not null гарантирует, что его нельзя оставить пустым.

insert into users (id, identifier, password, type) 
values (1, 'Bob', null, 'CUSTOMER'); 

1 row inserted. 

insert into users (id, identifier, password, type) 
values (2, 'Alice', null, null); 

ORA-01400: cannot insert NULL into ("SCHEMA"."USERS"."TYPE") 

insert into users (id, identifier, password, type) 
values (2, 'Alice', null, 'INVALID'); 

ORA-02290: check constraint (SCHEMA.SYS_C00113048) violated 

Было бы немного лучше использовать названные ограничения:

create table users (
    id number, 
    identifier varchar2(30), 
    password raw(64), 
    type varchar2(8) not null, 
    constraint users_pk primary key (id), 
    constraint users_type_ck check (type in ('CUSTOMER', 'COURIER')) 
); 

В более общем плане, в частности, со значениями, которые могут изменяться, вы бы просмотровой таблицы и внешнего ключа:

create table user_types (
    id number, 
    description varchar2(8), 
    constraint user_types_pk primary key (id), 
    constraint user_types_desc_uk unique (description) 
); 

create table users (
    id number, 
    identifier varchar2(30), 
    password raw(64), 
    type_id number not null, 
    constraint users_pk primary key (id), 
    constraint users_type_fk foreign key (type_id) references user_types(id) 
); 

insert into user_types (id, description) values (1, 'CUSTOMER'); 
insert into user_types (id, description) values (2, 'COURIER'); 

insert into users (id, identifier, password, type_id) 
values (1, 'Bob', null, 1); 

1 row inserted. 

insert into users (id, identifier, password, type_id) 
values (2, 'Alice', null, null); 

ORA-01400: cannot insert NULL into ("SCHEMA"."USERS"."TYPE_ID") 

insert into users (id, identifier, password, type_id) 
values (2, 'Alice', null, 3); 

ORA-02291: integrity constraint (SCHEMA.USERS_TYPE_FK) violated - parent key not found 
+0

спасибо, это мне очень помогло! –