Comment définir une valeur par défaut dans le champ Hibernate?
@ColumnDefault
Comment définir une valeur par défaut dans le champ Hibernate?
@ColumnDefault
Réponses:
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 columnDefinition
dépend de la base de données. De plus, si vous choisissez cette option, vous devez utiliser dynamic-insert
, donc Hibernate
n'inclut pas les colonnes avec des null
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;
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:
//... 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.
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?
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.
utiliser l'annotation d'hibernation
@ColumnDefault("-1")
private Long clientId;
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"
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'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.
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;
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
...
}
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é:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
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:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
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:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
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 la DEFAULT
clause SQL dans un script, plutôt que dans une annotation JPA.
Pour plus de détails sur l'utilisation de l'
@Generated
annotation, consultez cet article .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
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;
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.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}