Учитывая следующие аннотации JPA для класса сущности User, есть ли способ установить значение по умолчанию Role?

@Entity 
public class User {
    ...

    @NotNull
    @ManyToOne(targetEntity = Role.class, optional = false)
    private Role role;

Прямо сейчас я устанавливаю значение по умолчанию в моей первоначальной миграции Wildfly следующим образом:

create table users (
    id bigint generated by default as identity,
    name varchar(255), pwhash varchar(255),
    role_id bigint default 1 not null,              <- defuault FK ID set
    primary key (id));
alter table users
    add constraint FKtjpac0ubm4g9y5a5qi5ivebmw foreign key (role_id)
    references roles;
insert into roles (name) values ('USER');

Однако это значение по умолчанию отображается только в файле SQL. Я бы тоже предпочел иметь его в JPA.

Или этот тип функциональности скорее установлен в хранилище / DAO?


Основываясь на ответах, я попробовал это:

@Entity
public class User {
    ...

    public final static Role DEFAULT_ROLE = new Role();
    static {
       DEFAULT_ROLE.setId(1L);
       DEFAULT_ROLE.setName("USERS");
    }

    @NotNull
    @ManyToOne(targetEntity = Role.class, optional = false)
    private Role role = DEFAULT_ROLE;

Тем не менее, это добавляет ConstraintViolationException на INSERT.

0
Hubert Grzeskowiak 29 Май 2017 в 07:10

2 ответа

Лучший ответ

Вы можете указать точный SQL для создания столбца базы данных, используя @Column(columnDefinition="...."), включая любые значения по умолчанию.

Чтобы поддерживать представление Java в соответствии с этим значением по умолчанию, вы можете инициализировать поле role при создании, предполагая, что Role.defaultRole является Role, который вы хотите использовать по умолчанию. Очевидно, вы должны позаботиться о том, чтобы роль по умолчанию была правильно присоединена к вашему сеансу, то есть вы, вероятно, хотите загрузить ее из Session в первую очередь:

@NotNull
@ManyToOne(targetEntity = Role.class, optional = false)
private Role role = Role.defaultRole;
1
Jens Schauder 29 Май 2017 в 05:23

Вы можете сделать так же,

@NotNull
@Column(name = "ROLE_ID", columnDefinition = "int default 1")
private Integer role_id;
1
Abdullah Khan 29 Май 2017 в 07:55