2015-06-08 3 views
4

У нас есть объект с полем перечисления - emailCommunicationStatus, и мы хотим установить для него значение по умолчанию, используя аннотации JPA - 'UNKNOWN'.Spring JPA - значение по умолчанию для поля enum в enum

Однако, когда мы сохраняем объект в БД, значение этого поля составляет null, а не. Для булевского поля - isLocked сохраняется правильное значение по умолчанию (false).

@Entity 
public class Account { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    protected Long id; 

    @Column(columnDefinition = "boolean default false") 
    private boolean isLocked; 

    @Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'") 
    @Enumerated(value = EnumType.STRING) 
    private CommunicationStatus emailCommunicationStatus; 

    PlayerAccount() { 
     super(); 
    } 
} 

public enum CommunicationStatus { 
    VALID, 
    INVALID, 
    DONT_CONTACT, 
    UNKNOWN; 
} 

Если мы вместо этого использовать: @Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'") для emailCommunicationStatus мы получаем следующее исключение при сохранении:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'emailCommunicationStatus' cannot be null 

Что мы делаем не так? Почему он работает только с булевыми?

ответ

9

То, что вы сделали это полезно Whe некоторого SQL код вставляет строку без указания значения для столбца emailCommunicationStatus. В этом случае, строка будет иметь «UNKNOWN» в качестве значения для этого столбца:

insert into account (id, isLocked) values(1, false) 

Но Hibernate никогда не будет делать такую ​​вставку. Он всегда будет передавать фактическое значение поля emailCommunicationStatus этого объекта. Так что, если вы оставите его в нулевое значение, будет явно установить его в нуль в базе данных:

insert into account (id, isLocked, emailCommunicationStatus) values(1, false, null) 

Что вы хотите, чтобы установить значение по умолчанию для этого поля:

@Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'") 
@Enumerated(value = EnumType.STRING) 
private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN; 

Это прекрасно работает с isLocked, потому что значение по умолчанию для булевого поля ложно.

+0

Спасибо, что нужно знать. :) вот что будет. – Ayelet

2

Просто инициализируйте поле Entity. Hibernate будет создавать экземпляр класса объектов с уже установленным значением. Когда он сбрасывается, поле будет вставлено со значением, указанным.

private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN; 

С уважением

0

Наряду с добавлением столбца definitio вы можете установить динамические запросы. Но также проверяйте комментарии ниже, так как подход, похоже, обескуражен.

Если вы используете спящий режим версии < 4 вы должны аннотировать объект с

@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true) 

Когда свойство динамической вставки устанавливается истина, Hibernate делает не включают нулевые значения для свойств (для свойства, которые не заданы в приложении ) во время операции INSERT. Если свойство dynamic-update установлено в true, Hibernate не включает в себя немодифицированные свойства в операции UPDATE.

Для спящего режима> 4 вместо этого вы должны использовать @DynamicUpdate. Кроме того, инициализация в Java-коде также является хорошим советом.

+0

Вы уверены, что это работает? Похоже, что таблица OP имеет ограничение, не допускающее нулевые значения.Если вы INSERT что-то и все еще не указали явным образом значение столбца, оно все равно будет null. –

+0

Возможно, мне нужно перефразировать, я имею в виду использование разметки столбцов в сочетании с настройкой динамических запросов, отредактировал ответ –

+0

Это плохое решение: теперь база данных будет иметь «UNKNOWN» в качестве значения, но сущность в памяти по-прежнему будет иметь значение null , Документация Hibernate запрещает использование динамических вставок и обновлений. –

Смежные вопросы