Spring JPA - default value for enum field in enumeration

We have an object with an enumeration field - emailCommunicationStatusand we want to set the default value for it using JPA - annotations 'UNKNOWN'.

However, when we save the object in the database, the value of this field is equal to null, but not. For a boolean field, isLockedthe correct default value ( false) is stored .

@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;
}

If we instead use: @Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'")for emailCommunicationStatus, we get the following exception when saving:

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

What are we doing wrong? Why does it work only with boolers?

+4
source share
3 answers

, , , SQL- emailCommunicationStatus. "UNKNOWN" :

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

Hibernate ​​. emailCommunicationStatus . , null, null:

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, .

+9

Entity. Hibernate . , , .

private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN;

+2

definitio . , , , .

If you are using hibernate version <4 you must annotate your entity with

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

When the dynamic-insert property is set to true, Hibernate does not include null values ​​for properties (for properties that arent set upon request) during an INSERT operation. With the dynamic-update property set to true, Hibernate does not include unmodified properties in UPDATE operations.

For hibernation version> 4 you should use @DynamicUpdate. In addition, initialization in Java code is also good advice.

0
source

All Articles