Come posso impostare un valore predefinito nel campo Ibernazione?
@ColumnDefault
Come posso impostare un valore predefinito nel campo Ibernazione?
@ColumnDefault
Risposte:
Se si desidera un valore predefinito del database reale, utilizzare columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
Si noti che la stringa in columnDefinition
dipende dal database. Inoltre, se si sceglie questa opzione, è necessario utilizzare dynamic-insert
, quindi Hibernate
non includere le colonne con null
valori nell'inserto. Altrimenti, parlare di default è irrilevante.
Ma se non vuoi un valore predefinito per il database, ma semplicemente un valore predefinito nel tuo codice Java, inizializza la tua variabile in questo modo - private Integer myColumn = 100;
org.hibernate.annotations.Entity
è obsoleto. @DynamicInsert
l'annotazione dovrebbe essere usata invece.
È possibile utilizzare l' @PrePersist
anotation e impostare il valore predefinito nella fase pre-persistente.
Qualcosa del genere:
//... 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;
}
Questo metodo non dipende dal tipo / versione del database sotto l'ibernazione. Il valore predefinito viene impostato prima di persistere l'oggetto di mappatura.
setMyProperty
non è usato dal tuo esempio. Perché lo includi?
che ne dici di impostare un valore predefinito per il campo?
private String _foo = "default";
//property here
public String Foo
se passano un valore, verrà sovrascritto, altrimenti hai un valore predefinito.
usa l'annotazione ibernazione
@ColumnDefault("-1")
private Long clientId;
Se vuoi farlo nel database:
Impostare il valore predefinito nel database (esempio sql server):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
Mappatura del file di ibernazione:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
Vedi, la chiave è insert = "false" update = "false"
Una soluzione è far controllare il tuo getter per vedere se qualsiasi valore con cui stai lavorando è nullo (o qualunque sia il suo stato non inizializzato) e se è uguale a quello, restituisci semplicemente il tuo valore predefinito:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
Ho cercato questo e ho trovato molte risposte al valore predefinito per la colonna. Se si desidera utilizzare il valore predefinito definito nella tabella SQL, quindi nell'annotazione @Column utilizzare "insertable = false" . inseribile
@Column (name = columnName, length = lengthOfColumn, insertable = false)
Se si utilizza columnDefination, l'annotazione @Column potrebbe non funzionare poiché dipende dal database.
Lavorando con Oracle, stavo cercando di inserire un valore predefinito per un Enum
Ho trovato quanto segue per funzionare al meglio.
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
È possibile utilizzare il costruttore della classe java per impostare i valori predefiniti. Per esempio:
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
...
}
Per utilizzare il valore predefinito da qualsiasi colonna della tabella. quindi è necessario definire @DynamicInsert
come vero, altrimenti è sufficiente definire @DynamicInsert
. Perché l'ibernazione prende di default come vero. Considera come esempio dato:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
Se si desidera impostare un valore di proprietà dell'entità predefinito, è possibile inizializzare il campo entità utilizzando il valore predefinito.
Ad esempio, è possibile impostare l' createdOn
attributo entità predefinito sull'ora corrente, in questo modo:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
Se stai generando lo schema DDL con Hibernate, sebbene ciò non sia raccomandato, puoi utilizzare l' columnDefinition
attributo dell'annotazione JPA @Column
, in questo modo:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
L' @Generated
annotazione è necessaria perché vogliamo istruire Hibernate a ricaricare l'entità dopo aver scaricato il contesto di persistenza, altrimenti il valore generato dal database non sarà sincronizzato con lo stato dell'entità in memoria.
Invece di usare il columnDefinition
, stai meglio usando uno strumento come Flyway e usa gli script di migrazione incrementale DDL. In questo modo, imposterai la DEFAULT
clausola SQL in uno script, piuttosto che in un'annotazione JPA.
Per maggiori dettagli sull'uso
@Generated
dell'annotazione, consulta questo articolo .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
sto lavorando con Hibernate 5 e Postgres, e questo ha funzionato da me.
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
Se si desidera impostare il valore predefinito in termini di database, è sufficiente impostare @Column( columnDefinition = "int default 1")
Ma se ciò che intendi è impostare un valore predefinito nella tua app java, puoi impostarlo sull'attributo class in questo modo: private Integer attribute = 1;
Il suggerimento sopra funziona, ma solo se l'annotazione viene utilizzata sul metodo getter. Se le annotazioni vengono utilizzate dove viene dichiarato il membro, non accadrà nulla.
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}