Come impostare un valore di proprietà dell'entità predefinito con Hibernate


Risposte:


185

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;


6
Con annotazioni: @ org.hibernate.annotations.Entity (dynamicInsert = true)
homaxto

9
Attualmente org.hibernate.annotations.Entityè obsoleto. @DynamicInsertl'annotazione dovrebbe essere usata invece.
jannis,

1
Non consiglierei l'uso di ColumnDefinition per questa situazione, questo non è portatile da un database a un altro e devi conoscere il linguaggio SQL specifico del tuo server.
pdem,

@DynamicInsert deve essere aggiunto alla classe pojo del database.
Reaz Murshed il

3
Consiglierei di usare @ColumnDefault invece di ColumnDefinition in quanto è più indipendente dal database docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
jalsh

35

È 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.


Dato che setMyPropertynon è usato dal tuo esempio. Perché lo includi?
EndermanAPM,

Fornisco solo l'esempio delle annotazioni di ibernazione per la proprietà java standard (variabile privata con metodi pubblici get / set). Ho notato e corretto un errore ... Mancava il tipo di stringa del metodo set argumet.
dbricman,

30

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.


8
@michali: il ruolo di un valore predefinito non impedisce l'aggiornamento del valore, vero?
Janusz Lenar,

27

usa l'annotazione ibernazione

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

Grazie, funziona. Ma ho dovuto ricreare il tavolo.
Yamashiro Rion

1
Questa dovrebbe essere la vera soluzione, usando columnDefinition come proposto dalla risposta attuale è una fretta e devi includere il tipo. L'annotazione @ColumnDefault è molto più facile secondo me.
Judos,

7

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"


C'è un problema per Oracle: se la proprietà non è nulla, il suo valore è ANCORA il valore predefinito. Non il valore reale.
Youngzy,

5

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;
}

Sto usando un mapper che chiama il setter sul mio oggetto entità. C'è un aspetto negativo nell'utilizzo del frammento di codice sia sul getter che sul setter?
Eric Francis,

4

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.


Funziona benissimo per colonne come "CreatedAt" in cui si desidera sempre utilizzare il valore predefinito DB. Grazie!
Michal Filip,

4

Usa @ColumnDefault()annotazione. Questo è solo in letargo.


2

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;

2

È 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
...

}

2

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;

}

2

Valore predefinito della proprietà dell'entità

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();

Valore di colonna predefinito

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 .



1

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;

0

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;


-3

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.