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

145

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

Dejell
la source
3
Utilisez-vous le fichier de configuration XML ou des annotations?
Bruno
2
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
pdem

Réponses:

185

Si vous voulez une vraie valeur par défaut de base de données, utilisez columnDefinition:

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

Notez que la chaîne dans columnDefinitiondépend de la base de données. De plus, si vous choisissez cette option, vous devez utiliser dynamic-insert, donc Hibernaten'inclut pas les colonnes avec des nullvaleurs à l'insertion. Sinon, parler de défaut n'a pas d'importance.

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

Petar Minchev
la source
6
Avec annotations: @ org.hibernate.annotations.Entity (dynamicInsert = true)
retour au
9
Actuellement org.hibernate.annotations.Entityest obsolète. @DynamicInsertl'annotation doit être utilisée à la place.
jannis le
1
Je ne recommanderais pas d'utiliser columnDefinition pour cette situation, ce n'est pas portable d'une base de données à une autre et vous devez connaître le langage SQL spécifique de votre serveur.
pdem
@DynamicInsert doit être ajouté à la classe pojo de la base de données.
Reaz Murshed
3
Je recommande d'utiliser @ColumnDefault au lieu de columnDefinition car il s'agit davantage de docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh
35

Vous pouvez utiliser une @PrePersistnotation et définir la valeur par défaut dans l'étape de pré-persistance.

Quelque chose comme ca:

//... 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 de conserver l'objet de mappage.

dbricman
la source
Étant donné que ce setMyPropertyn'est pas utilisé par votre exemple. Pourquoi l'incluez-vous?
EndermanAPM
Je donne juste l'exemple des annotations d'hibernation pour la propriété java standard (variable privée avec des méthodes publiques get / set). J'ai remarqué et corrigé une erreur ... Le type de chaîne de la méthode définie argumet était manquant.
dbricman
30

qu'en est-il simplement de définir une valeur par défaut pour le champ?

private String _foo = "default";

//property here
public String Foo

s'ils passent une valeur, elle sera écrasée, sinon, vous avez une valeur par défaut.

Tim Hoolihan
la source
8
@michali: le rôle d'une valeur par défaut n'empêche pas de mettre à jour la valeur, n'est-ce pas?
Janusz Lenar
27

utiliser l'annotation d'hibernation

@ColumnDefault("-1")
private Long clientId;
Mazen Embaby
la source
Merci, ça marche. Mais j'ai dû recréer la table.
Yamashiro Rion
1
Cela devrait être la vraie solution, utiliser columnDefinition comme proposé par la réponse actuelle est une hâte et vous devez inclure le type. L'annotation @ColumnDefault est beaucoup plus facile à mon avis.
judos
7

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

Définissez 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]

Mappage du fichier de mise en veille prolongée:

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

Voir, la clé est insert = "false" update = "false"

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

Une solution consiste à faire vérifier votre getter pour voir si la valeur avec laquelle vous travaillez est nulle (ou quel que soit son état non initialisé) et si elle est égale à cela, renvoyez simplement votre valeur par défaut:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
Ian Dallas
la source
J'utilise un mappeur 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?
Eric Francis
4

J'ai cherché cela et j'ai trouvé de nombreuses réponses à la valeur par défaut de la colonne. Si vous souhaitez utiliser la valeur par défaut définie dans SQL Table, dans @Column Annotation, utilisez " insertable = false" . insérable

@Column (name = columnName, length = lengthOfColumn, insertable = false)

Si vous utilisez columnDefination, l'annotation @Column peut ne pas fonctionner car elle dépend de la base de données.

Garvit Bansal
la source
Cela fonctionne très bien pour les colonnes comme "createdAt" où vous souhaitez toujours utiliser la valeur par défaut de la base de données. Merci!
Michal Filip
4

Utilisez l' @ColumnDefault()annotation. Ceci est cependant uniquement en veille prolongée.

T3rm1
la source
2

En travaillant avec Oracle, j'essayais d'insérer une valeur par défaut pour un Enum

J'ai trouvé que ce qui suit fonctionnait le mieux.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
Bojan Petkovic
la source
2

Vous pouvez utiliser le constructeur de classe java pour définir les valeurs par défaut. Par exemple:

public class Entity implements Serializable{
 private Double field1
 private Integer field2;
 private T fieldN;

 public Entity(){
  this.field1=0.0;
  this.field2=0;
  ...
  this.fieldN= <your default value>
 }

 //Setters and Getters
...

}
IKavanagh
la source
2

Pour utiliser la valeur par défaut de n'importe quelle colonne de la table. alors vous devez avoir besoin de définir @DynamicInsertcomme vrai ou bien vous définissez simplement @DynamicInsert. Parce que hibernate prend par défaut comme vrai. Considérez comme l'exemple donné:

@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {

    @Column(name = "status", columnDefinition = "int default 100")
    private Long status;

}
Dilip Verma
la source
2

Valeur de propriété d'entité par défaut

Si vous souhaitez définir une valeur de propriété d'entité par défaut, vous pouvez initialiser le champ d'entité à l'aide de la valeur par défaut.

Par exemple, vous pouvez définir l' createdOnattribut d'entité par défaut sur l'heure actuelle, comme ceci:

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

Valeur de colonne par défaut

Si vous générez le schéma DDL avec Hibernate, bien que cela ne soit pas recommandé, vous pouvez utiliser l' columnDefinitionattribut de l' @Columnannotation JPA , comme ceci:

@Column(
    name = "created_on", 
    columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;

L' @Generatedannotation est nécessaire car nous voulons demander à Hibernate de recharger l'entité une fois le contexte de persistance vidé, sinon la valeur générée par la base de données ne sera pas synchronisée avec l'état de l'entité en mémoire.

Au lieu d'utiliser le columnDefinition, il vaut mieux utiliser un outil comme Flyway et utiliser des scripts de migration incrémentielle DDL. De cette façon, vous définissez la DEFAULTclause SQL dans un script, plutôt que dans une annotation JPA.

Pour plus de détails sur l'utilisation de l' @Generatedannotation, consultez cet article .

Vlad Mihalcea
la source
1

Je travaille avec hibernate 5 et postgres, et cela a fonctionné de moi.

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
Ala Messaoudi
la source
0

Si vous souhaitez définir la valeur par défaut en termes de base de données, définissez simplement @Column( columnDefinition = "int default 1")

Mais si vous avez l'intention de définir une valeur par défaut dans votre application java, vous pouvez la définir sur votre attribut de classe comme ceci: private Integer attribute = 1;

Edgencio Da Calista
la source
-3

La suggestion ci-dessus fonctionne, mais uniquement si l'annotation est utilisée sur la méthode getter. Si les annotations sont utilisées là où le membre est déclaré, rien ne se passera.

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