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


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;


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.


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


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;

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"


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

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.


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.


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;

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

}

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;

}

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 .



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;

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;


-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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.