2010-06-24 9 views
98

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

+3

Utilisez-vous le fichier de configuration XML ou les annotations? – Bruno

+1

La réponse ci-dessous ne donne que des solutions JPA, ce qui est correct mais .pour une solution Hibernate voir http://stackoverflow.com/questions/28107554/define-default-column-value-with-annotations-in-hibernate vous devez utiliser '@ ColumnDefault' – pdem

Répondre

131

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

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

+5

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

+4

Actuellement, 'org.hibernate.annotations.Entity' est obsolète. L'annotation '@ DynamicInsert' devrait être utilisée à la place. – jannis

+0

Je ne recommanderais pas d'utiliser columnDefinition pour cette situation, ce n'est pas portable d'une base de données à l'autre, et vous devez connaître la langue SQL spécifique de votre serveur. – pdem

23

Qu'en est-il juste de définir une valeur par défaut pour le champ? Si elles transmettent une valeur, elles seront remplacées, sinon, vous avez une valeur par défaut.

+7

Cela ne l'empêche pas de le définir sur null à un moment donné. – michali

+2

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

5

Une solution est d'avoir votre chèque getter pour voir si quelle que soit la valeur vous travaillez est nulle (ou quel que soit son état non initialisé serait) et si elle est égale à celle, juste retourner votre valeur par défaut:

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

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

6

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

Définir le val par défaut UE dans la base de données (exemple de serveur sql):

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

fichier Mise en veille prolongée Mapping:

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

Voir, la clé est d'insérer = "false" update = "false"

+0

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

19

Vous pouvez utiliser @ Préprésentez une anotation et définissez la valeur par défaut dans l'étape de 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 est dépend pas du type/la version de base de données sous la mise en veille prolongée. La valeur par défaut est définie avant de conserver l'objet de mappage.

+0

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

+0

Je donne juste l'exemple des annotations d'hibernation pour la propriété java standard (variable privée avec des méthodes get/set publiques). J'ai remarqué et corrigé une erreur ... String type de la méthode set argumet manquait. – dbricman

5

La solution proposée ci-dessus pour définir la valeur par défaut en utilisant Hibernate

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

est spécifique au fournisseur et ne fonctionnera pas pour Oracle.

+3

Alors, qui fonctionnerait pour Oracle? – dade

+9

cela aurait dû être un commentaire, pas une réponse – azerafati

-3

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

public String getStringValue(){ 
    return (this.stringValue == null) ? "Default" : stringValue; 
} 
1
<property name="age" type="integer"> 
<column name="age" not-null="false" default="null" /> 
</property> 
+5

Avez-vous l'intention de [expliquer votre solution] (http://stackoverflow.com/help/how-to-answer) un peu? Vous pouvez lire [Comment écrire une bonne réponse] (http://stackoverflow.com/help/how-to-answer). –

3

J'ai cherché pour cela et trouvé beaucoup de réponses à une valeur par défaut pour column.If que vous souhaitez utiliser la valeur par défaut définie dans le tableau SQL puis dans @Column Annotation utiliser « insérable = false » .insérable

@Column (name = columnName, longueur = lengthOfColumn, insérable = false)

Si vous utilisez columnDefination il @Column l'annotation peut être il ne fonctionnera pas car elle dépend base de données.

0

Travailler avec Oracle, j'ai essayé d'insérer une valeur par défaut pour un Enum

J'ai trouvé ce qui suit pour travailler le meilleur.

@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

Utilisez l'annotation @ColumnDefault(). C'est hiberner seulement si.

1

annotation mise en veille prolongée utilisation

@ColumnDefault("-1") 
private Long clientId; 
+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. - [De l'avis] (/ review/low-quality-posts/18356040) – Mamun

0

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

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

Questions connexes