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 columnDefinitiondipende dal database. Inoltre, se si sceglie questa opzione, è necessario utilizzare dynamic-insert, quindi Hibernatenon includere le colonne con nullvalori 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. @DynamicInsertl'annotazione dovrebbe essere usata invece.
È possibile utilizzare l' @PrePersistanotation 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.
setMyPropertynon è 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 @DynamicInsertcome 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' createdOnattributo 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' columnDefinitionattributo dell'annotazione JPA @Column, in questo modo:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
L' @Generatedannotazione è 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 DEFAULTclausola SQL in uno script, piuttosto che in un'annotazione JPA.
Per maggiori dettagli sull'uso
@Generateddell'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;
}