web-dev-qa-db-fra.com

Ne fonctionne pas en définissant la valeur par défaut de la propriété dans Hibernate

J'ai une propriété booléenne dans mon entité. Voici mes annotations pour cela:

@Column(name = "IS_ACTIVE", nullable = false, columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
    return isActive;
}

Mais columnDefinition="BIT DEFAULT 1" ne fonctionnent pas parfaitement. Voici le code SQL que j'obtiens comme résultat pour la table générée:

IS_ACTIVE BIT(1) NOT NULL,

Qu'est-ce que je fais mal?

Et donc quand j'essaie d'enregistrer une instance de cette classe dans la base de données, j'obtiens l'exception:

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

Si je supprime nullable = false propriété:

@Column(name = "IS_ACTIVE", columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
    return isActive;
}

afin que je puisse enregistrer un objet créé dans ce cas. Mais c'est toujours le la valeur par défaut n'est pas définie et j'obtiens NULL dans la valeur de ce champ dans la base de données.

Des idées s'il vous plait? J'utilise MySQL Server 5.1 si c'est important. je serais très reconnaissant pour toute aide. Merci d'avance!

16
Philiph Bruno

Essayez d'utiliser le type de données BOOLEAN, définissez votre @Column annotation comme ça:

@Column(name = "IS_ACTIVE", columnDefinition = "boolean default true", nullable = false)
private Boolean active = true;
36
Aleksandr M

référence à la bonne réponse dans ce lien Comment définir la valeur par défaut dans Hibernate

Si vous voulez une vraie valeur par défaut de la base de données, utilisez columnDefinition - @Column (name = "myColumn", nullable = false, columnDefinition = "int default 100"). Notez que la chaîne de columnDefinition dépend de la base de données. Aussi si vous choisissez cette option , vous devez utiliser dynamic-insert, donc Hibernate n'inclut pas de colonnes avec des valeurs nulles sur insert. Sinon, parler de défaut n'est pas pertinent.

La clé de la solution est l'annotation d'insertion dynamique. Vous pouvez l'ajouter à votre classe d'entité comme cet exemple: @org.hibernate.annotations.Entity(dynamicInsert = true)

1
Peter T.