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:
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;
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.
Vous pouvez utiliser une @PrePersistnotation et définir la valeur par défaut dans l'étape de pré-persistance.
Quelque chose comme ca:
//... some codeprivateString myProperty;//... some code@PrePersistpublicvoid 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.publicString getMyProperty(){return myProperty;}publicvoid 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?
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]
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:
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
Vous pouvez utiliser le constructeur de classe java pour définir les valeurs par défaut. Par exemple:
publicclassEntityimplementsSerializable{privateDouble field1
privateInteger field2;private T fieldN;publicEntity(){this.field1=0.0;this.field2=0;...this.fieldN=<your default value>}//Setters and Getters...}
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é:
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")privateLocalDateTime 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)privateLocalDateTime 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 .
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;
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.
@ColumnDefault
Réponses:
Si vous voulez une vraie valeur par défaut de base de données, utilisez
columnDefinition
:Notez que la chaîne dans
columnDefinition
dépend de la base de données. De plus, si vous choisissez cette option, vous devez utiliserdynamic-insert
, doncHibernate
n'inclut pas les colonnes avec desnull
valeurs à 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;
la source
org.hibernate.annotations.Entity
est obsolète.@DynamicInsert
l'annotation doit être utilisée à la place.Vous pouvez utiliser une
@PrePersist
notation et définir la valeur par défaut dans l'étape de pré-persistance.Quelque chose comme ca:
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.
la source
setMyProperty
n'est pas utilisé par votre exemple. Pourquoi l'incluez-vous?qu'en est-il simplement de définir une valeur par défaut pour le champ?
s'ils passent une valeur, elle sera écrasée, sinon, vous avez une valeur par défaut.
la source
utiliser l'annotation d'hibernation
la source
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):
Mappage du fichier de mise en veille prolongée:
Voir, la clé est insert = "false" update = "false"
la source
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:
la source
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
Si vous utilisez columnDefination, l'annotation @Column peut ne pas fonctionner car elle dépend de la base de données.
la source
Utilisez l'
@ColumnDefault()
annotation. Ceci est cependant uniquement en veille prolongée.la source
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.
la source
Vous pouvez utiliser le constructeur de classe java pour définir les valeurs par défaut. Par exemple:
la source
Pour utiliser la valeur par défaut de n'importe quelle colonne de la table. alors vous devez avoir besoin de définir
@DynamicInsert
comme vrai ou bien vous définissez simplement@DynamicInsert
. Parce que hibernate prend par défaut comme vrai. Considérez comme l'exemple donné:la source
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'
createdOn
attribut d'entité par défaut sur l'heure actuelle, comme ceci: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'
columnDefinition
attribut de l'@Column
annotation JPA , comme ceci:L'
@Generated
annotation 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 laDEFAULT
clause SQL dans un script, plutôt que dans une annotation JPA.la source
la source
Je travaille avec hibernate 5 et postgres, et cela a fonctionné de moi.
la source
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;
la source
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.
la source