175 votes

Comment définir la valeur par défaut d'une propriété d'entité avec Hibernate ?

Comment définir une valeur par défaut dans un champ Hibernate ?

3 votes

Utilisez-vous le fichier de configuration XML ou des annotations ?

2 votes

La réponse ci-dessous ne donne que des solutions JPA, ce qui est correct, mais pour une solution Hibernate, voir stackoverflow.com/questions/28107554/ vous devez utiliser @ColumnDefault

215voto

Petar Minchev Points 24864

Si vous souhaitez une valeur par défaut réelle pour la base de données, utilisez columnDefinition :

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

Remarquez que la chaîne de caractères dans columnDefinition dépend de la base de données. De plus, si vous choisissez cette option, vous devez utiliser dynamic-insert Ainsi Hibernate n'inclut pas les colonnes avec null lors de l'insertion. Autrement, parler de valeur par défaut n'est pas pertinent.

Mais si vous ne voulez pas de valeur par défaut de base de données, mais simplement une valeur par défaut dans votre code Java, initialisez simplement votre variable comme ceci - private Integer myColumn = 100;

6 votes

Avec des annotations : @org.hibernate.annotations.Entity(dynamicInsert = true)

12 votes

Actuellement org.hibernate.annotations.Entity est obsolète. @DynamicInsert doit être utilisée à la place.

3 votes

Je ne recommanderais pas l'utilisation de columnDefinition dans cette situation, car elle n'est pas transférable d'une base de données à une autre, et vous devez connaître le langage SQL spécifique de votre serveur.

39voto

dbricman Points 41

Vous pouvez utiliser @PrePersist et fixer la valeur par défaut au stade de la pré-persistance.

Quelque chose comme ça :

//... some code
private String myProperty;
//... some code

@PrePersist
public void prePersist() {
    if(myProperty == null) //We set default value in case if the value is not set yet.
        myProperty = "Default value";
}

// property methods
@Column(nullable = false) //restricting Null value on database level.
public String getMyProperty() {
    return myProperty;
}

public void setMyProperty(String myProperty) {
    this.myProperty= myProperty;
}

Cette méthode ne dépend pas du type/de la version de la base de données sous Hibernate. La valeur par défaut est définie avant la persistance de l'objet de mappage.

0 votes

Étant donné que setMyProperty n'est pas utilisé dans votre exemple. Pourquoi l'incluez-vous ?

0 votes

Je donne simplement l'exemple des annotations Hibernate pour une propriété Java standard (variable privée avec des méthodes publiques get/set). J'ai remarqué et corrigé une erreur... Le type String de l'argumet de la méthode set était manquant.

32voto

Tim Hoolihan Points 6982

Pourquoi ne pas simplement définir une valeur par défaut pour le champ ?

private String _foo = "default";

//property here
public String Foo

s'ils transmettent une valeur, celle-ci sera écrasée, sinon, vous avez une valeur par défaut.

9 votes

@michali : le rôle d'une valeur par défaut n'empêche pas la mise à jour de la valeur, n'est-ce pas ?

8voto

Cleydson Points 61

Si vous voulez le faire dans une base de données :

Définir la valeur par défaut dans la base de données (exemple de serveur SQL) :

ALTER TABLE [TABLE_NAME] ADD  CONSTRAINT [CONSTRAINT_NAME]  DEFAULT (newid()) FOR [COLUMN_NAME]

Cartographie du fichier hibernate :

    <hibernate-mapping ....
    ...    
    <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false"  insert="false" update="false"  />
    ...

La clé est insert="false" update="false"

0 votes

Il y a un problème pour Oracle : si la propriété n'est pas nulle, sa valeur reste la valeur par défaut. Pas la valeur réelle.

6voto

tkeE2036 Points 3778

Une solution consiste à vérifier si la valeur avec laquelle vous travaillez est nulle (ou quel que soit son état non initialisé) et, si elle est égale à cette valeur, à renvoyer la valeur par défaut :

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

0 votes

J'utilise un mapper qui appelle le setter sur mon objet entité. Y a-t-il un inconvénient à utiliser votre extrait de code à la fois sur le getter et le setter ?

0 votes

J'utilise Spring Boot. Dans cette classe d'entité, j'ai essayé de faire ceci : > private Long trianglesCount ; @Column(name = "triangles_count") public Long getTrianglesCount() { if(this.trianglesCount == null) return 0L ; else return this.trianglesCount ; } this ne sauvegarde pas 0L par défaut. il sauvegarde null dans la db.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X