Festlegen von Standardwerten für Spalten in JPA

245

Ist es möglich, einen Standardwert für Spalten in JPA festzulegen, und wenn ja, wie erfolgt dies mithilfe von Anmerkungen?

homaxto
quelle
gibt es in der JPA-Trennung, wo kann ich Standardwert für eine Spalte als Wert für eine andere Spalte setzen, weil ich möchte, dass es ausgeblendet wird
shareef
3
Verwandte: Hibernate hat @ org.hibernate.annotations.ColumnDefault ("foo")
Ondra Žižka

Antworten:

230

Tatsächlich ist es in JPA möglich, obwohl ein kleiner Hack die columnDefinitionEigenschaft der @ColumnAnnotation verwendet, zum Beispiel:

@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
Cameron Pope
quelle
3
10 ist der Integer-Teil und 2 ist der Dezimalteil der Zahl, also: 1234567890.12 wäre eine unterstützte Zahl.
Nathan Feger
23
Beachten Sie auch, dass diese columnDefinition nicht unbedingt datenbankunabhängig ist und sicherlich nicht automatisch mit dem Datentyp in Java verknüpft ist.
Nathan Feger
47
Nachdem Sie eine Entität mit einem Nullfeld erstellt und beibehalten haben, wird der Wert nicht mehr festgelegt. Keine Lösung ...
Pascal Thivent
18
Nein @NathanFeger, 10 ist die Länge und 2 der Dezimalteil. 1234567890.12 wäre also keine unterstützte Nummer, aber 12345678.90 ist gültig.
GPrimola
4
Sie benötigen, insertable=falsewenn die Spalte nullwertfähig ist (und um das nicht benötigte Spaltenargument zu vermeiden).
eckes
314

Sie können Folgendes tun:

@Column(name="price")
private double price = 0.0;

Dort! Sie haben gerade Null als Standardwert verwendet.

Beachten Sie, dass dies nur dann von Nutzen ist, wenn Sie nur über diese Anwendung auf die Datenbank zugreifen. Wenn andere Anwendungen die Datenbank ebenfalls verwenden, sollten Sie diese Prüfung in der Datenbank mithilfe des Annotation-Attributs columnDefinition von Cameron oder auf andere Weise durchführen.

Pablo Venturino
quelle
38
Dies ist der richtige Weg, wenn Ihre Entitäten nach dem Einfügen den richtigen Wert haben sollen. +1
Pascal Thivent
16
Durch Festlegen des Standardwerts eines nullbaren Attributs (eines Attributs mit einem nicht primitiven Typ) in der Modellklasse werden Kriterienabfragen unterbrochen, die ein ExampleObjekt als Prototyp für die Suche verwenden. Nach dem Festlegen eines Standardwerts ignoriert eine Beispielabfrage im Ruhezustand die zugeordnete Spalte nicht mehr, wo sie zuvor ignoriert wurde, weil sie null war. Ein besserer Ansatz besteht darin, alle Standardwerte unmittelbar vor dem Aufrufen eines Ruhezustands save()oder festzulegen update(). Dies ahmt das Verhalten der Datenbank besser nach, die beim Speichern einer Zeile Standardwerte festlegt.
Derek Mahar
1
@Harry: Dies ist die richtige Methode zum Festlegen von Standardwerten, außer wenn Sie Kriterienabfragen verwenden, die ein Beispiel als Prototyp für die Suche verwenden.
Derek Mahar
12
Dies stellt nicht sicher, dass die Standardeinstellung für nicht primitive Typen festgelegt ist ( nullz. B. Einstellung ). Verwenden @PrePersistund @PreUpdateist eine bessere Option imho.
Jasper
3
Dies ist der richtige Weg, um den Standardwert für die Spalte anzugeben. columnDefinitionDie Eigenschaft ist nicht datenbankunabhängig und @PrePersistüberschreibt Ihre Einstellung vor dem Einfügen. "Standardwert" ist etwas anderes. Der Standardwert wird verwendet, wenn der Wert nicht explizit festgelegt wird.
Utku Özdemir
110

Ein anderer Ansatz ist die Verwendung von javax.persistence.PrePersist

@PrePersist
void preInsert() {
   if (this.createdTime == null)
       this.createdTime = new Date();
}
Husin Wijaya
quelle
1
Ich habe einen solchen Ansatz zum Hinzufügen und Aktualisieren von Zeitstempeln verwendet. Es hat sehr gut funktioniert.
Spina
10
Sollte das nicht sein if (createdt != null) createdt = new Date();oder so? Im Moment wird dadurch ein explizit angegebener Wert überschrieben, was dazu führt, dass er nicht wirklich ein Standardwert ist.
Max Nanasy
16
@ MaxNanasyif (createdt == null) createdt = new Date();
Shane
Wäre es wichtig, wenn sich Client und Datenbank in unterschiedlichen Zeitzonen befinden? Ich stelle mir vor, dass die Verwendung von "TIMESTAMP DEFAULT CURRENT_TIMESTAMP" die aktuelle Uhrzeit auf dem Datenbankserver und "createdt = new Date ()" die aktuelle Uhrzeit im Java-Code abrufen würde, aber diese beiden Zeiten sind möglicherweise nicht identisch, wenn Der Client stellt in einer anderen Zeitzone eine Verbindung zu einem Server her.
FrustratedWithFormsDesigner
nullScheck hinzugefügt .
Ondra Žižka
49

Im Jahr 2017 hat JPA 2.1 nur noch das, @Column(columnDefinition='...')in das Sie die wörtliche SQL-Definition der Spalte einfügen. Das ist ziemlich unflexibel und zwingt Sie, auch die anderen Aspekte wie Typ zu deklarieren, wodurch die Ansicht der JPA-Implementierung in dieser Angelegenheit kurzgeschlossen wird.

Hibernate hat jedoch Folgendes:

@Column(length = 4096, nullable = false)
@org.hibernate.annotations.ColumnDefault("")
private String description;

Gibt den DEFAULT-Wert an, der über DDL auf die zugeordnete Spalte angewendet werden soll.

Zwei Anmerkungen dazu:

1) Haben Sie keine Angst davor, nicht dem Standard zu entsprechen. Als JBoss-Entwickler habe ich einige Spezifikationsprozesse gesehen. Die Spezifikation ist im Grunde die Basis, die die großen Akteure in einem bestimmten Bereich bereit sind, sich für das nächste Jahrzehnt oder so zur Unterstützung zu verpflichten. Es ist wahr für die Sicherheit, für Messaging, ORM ist kein Unterschied (obwohl JPA ziemlich viel abdeckt). Meine Erfahrung als Entwickler zeigt, dass Sie in einer komplexen Anwendung früher oder später ohnehin eine nicht standardmäßige API benötigen. Und @ColumnDefaultist ein Beispiel, wenn es die Nachteile einer nicht standardmäßigen Lösung überwiegt.

2) Es ist schön, wie jeder die Initialisierung von @PrePersist oder Konstruktormitgliedern winkt. Aber das ist NICHT dasselbe. Wie wäre es mit Massen-SQL-Updates? Wie wäre es mit Anweisungen, die die Spalte nicht setzen? DEFAULThat seine Rolle und kann nicht durch Initialisieren eines Java-Klassenmitglieds ersetzt werden.

Ondra Žižka
quelle
Welche Version von Annotationen im Ruhezustand kann ich für Wildfly 12 verwenden? Ich erhalte einen Fehler mit einer bestimmten Version davon. Vielen Dank im Voraus!
Fernando Pie
Danke Ondra. Gibt es 2019 weitere Lösungen?
Alan
1
@ Alan nicht auf Lager JPA, leider.
Jwenting
13

JPA unterstützt das nicht und es wäre nützlich, wenn es dies tun würde. Die Verwendung von columnDefinition ist DB-spezifisch und in vielen Fällen nicht akzeptabel. Das Festlegen eines Standardwerts in der Klasse reicht nicht aus, wenn Sie einen Datensatz mit Nullwerten abrufen (was normalerweise passiert, wenn Sie alte DBUnit-Tests erneut ausführen). Was ich tue ist folgendes:

public class MyObject
{
    int attrib = 0;

    /** Default is 0 */
    @Column ( nullable = true )
    public int getAttrib()

    /** Falls to default = 0 when null */
    public void setAttrib ( Integer attrib ) {
       this.attrib = attrib == null ? 0 : attrib;
    }
}

Java Auto-Boxing hilft dabei sehr.

Marco
quelle
Missbrauche keine Setter! Sie dienen zum Einstellen eines Parameters in einem Objektfeld. Nichts mehr! Verwenden Sie besser den Standardkonstruktor für Standardwerte.
Roland
@ Roland ist theoretisch nett, funktioniert aber nicht immer, wenn es sich um eine vorhandene Datenbank handelt, die bereits Nullwerte enthält, für die Ihre Anwendung diese nicht haben möchte. Sie müssten zuerst eine Datenbankkonvertierung durchführen, bei der Sie die Spalte nicht null machen und gleichzeitig einen sinnvollen Standard festlegen, und dann das Spiel anderer Anwendungen behandeln, die davon ausgehen, dass es tatsächlich nullbar ist (wenn Sie dies tun) kann sogar die Datenbank ändern).
Jwenting
Wenn es um #JPA und Setter / Getter geht, müssen sie immer reine Setter / Getter sein, sonst ist Ihre Anwendung eines Tages gewachsen und wird zu einem Alptraum für die Wartung. Der beste Rat ist KISS hier (ich bin nicht schwul, LOL).
Roland
10

Da ich bei dem Versuch, das gleiche Problem zu lösen, auf Google gestoßen bin, werde ich nur die Lösung einwerfen, die ich mir ausgedacht habe, falls jemand sie nützlich findet.

Aus meiner Sicht gibt es wirklich nur 1 Lösung für dieses Problem - @PrePersist. Wenn Sie dies in @PrePersist tun, müssen Sie überprüfen, ob der Wert bereits festgelegt wurde.

TC1
quelle
4
+1 - Ich würde mich definitiv für den Einsatz @PrePersistvon OP entscheiden. @Column(columnDefinition=...)scheint nicht sehr elegant.
Piotr Nowicki
@PrePersist hilft Ihnen nicht, wenn sich bereits Daten mit Nullwerten im Speicher befinden. Eine Datenbankkonvertierung wird nicht auf magische Weise für Sie durchgeführt.
Jwenting
10
@Column(columnDefinition="tinyint(1) default 1")

Ich habe das Problem gerade getestet. Es funktioniert gut. Danke für den Tipp.


Über die Kommentare:

@Column(name="price") 
private double price = 0.0;

Dieser legt (natürlich) nicht den Standardspaltenwert in der Datenbank fest.

asd
quelle
9
Auf Objektebene funktioniert dies nicht einwandfrei (Sie erhalten den Datenbankstandardwert nach dem Einfügen in Ihre Entität nicht). Standard auf Java-Ebene.
Pascal Thivent
Es funktioniert (insbesondere, wenn Sie insertable = false in der Datenbank angeben, aber leider wird die zwischengespeicherte Version nicht aktualisiert (auch nicht, wenn JPA die Tabelle und die Spalten auswählt). Zumindest nicht im Ruhezustand: - / aber auch, wenn dies zusätzlich funktioniert Hin- und Rückfahrt ist schlecht.
eckes
9

Sie können die Java Reflect API verwenden:

    @PrePersist
    void preInsert() {
       PrePersistUtil.pre(this);
    }

Das ist üblich:

    public class PrePersistUtil {

        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");


        public static void pre(Object object){
            try {
                Field[] fields = object.getClass().getDeclaredFields();
                for(Field field : fields){
                    field.setAccessible(true);
                    if (field.getType().getName().equals("java.lang.Long")
                            && field.get(object) == null){
                        field.set(object,0L);
                    }else if    (field.getType().getName().equals("java.lang.String")
                            && field.get(object) == null){
                        field.set(object,"");
                    }else if (field.getType().getName().equals("java.util.Date")
                            && field.get(object) == null){
                        field.set(object,sdf.parse("1900-01-01"));
                    }else if (field.getType().getName().equals("java.lang.Double")
                            && field.get(object) == null){
                        field.set(object,0.0d);
                    }else if (field.getType().getName().equals("java.lang.Integer")
                            && field.get(object) == null){
                        field.set(object,0);
                    }else if (field.getType().getName().equals("java.lang.Float")
                            && field.get(object) == null){
                        field.set(object,0.0f);
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }
Thomas Zhang
quelle
2
Ich mag diese Lösung, habe aber einen Schwachpunkt. Ich denke, das wäre wichtig, um zu überprüfen, ob die Spalte nullwertfähig ist oder nicht, bevor der Standardwert festgelegt wird.
Luis Carlos
Wenn Sie es vorziehen, ist es möglicherweise auch in Ordnung, den Code von Field[] fields = object.getClass().getDeclaredFields();in for()einzufügen. Fügen finalSie außerdem Parameter / abgefangene Ausnahmen hinzu, da Sie nicht versehentlich objectgeändert werden möchten . Fügen Sie auch eine Überprüfung hinzu null: if (null == object) { throw new NullPointerException("Parameter 'object' is null"); }. Das stellt sicher, dass object.getClass()das Aufrufen sicher ist und kein a auslöst NPE. Der Grund ist, Fehler von faulen Programmierern zu vermeiden. ;-)
Roland
7

Ich benutze columnDefinitionund es funktioniert sehr gut

@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

private Date createdDate;
Tong
quelle
6
Dies scheint Ihre jpa-Implementierung herstellerspezifisch zu machen.
Udo Held
Es macht nur den DDL-Anbieter spezifisch. Aber Sie haben höchstwahrscheinlich sowieso herstellerspezifische DDL-Hacks. Wie oben erwähnt, wird der Wert (auch wenn insertable = false) in der Datenbank angezeigt, jedoch nicht im Entitätscache der Sitzung (zumindest nicht im Ruhezustand).
eckes
7

Sie können dies nicht mit der Spaltenanmerkung tun. Ich denke, die einzige Möglichkeit besteht darin, den Standardwert festzulegen, wenn ein Objekt erstellt wird. Vielleicht wäre der Standardkonstruktor der richtige Ort dafür.

Timo
quelle
Gute Idee. Leider gibt es keine generischen Anmerkungen oder Attribute für @Columnaround. Und ich vermisse es auch, Kommentare zu setzen (entnommen aus Java doctag).
Roland
5

In meinem Fall habe ich den Quellcode des Ruhezustands geändert, um eine neue Anmerkung einzuführen @DefaultValue:

commit 34199cba96b6b1dc42d0d19c066bd4d119b553d5
Author: Lenik <xjl at 99jsj.com>
Date:   Wed Dec 21 13:28:33 2011 +0800

    Add default-value ddl support with annotation @DefaultValue.

diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java b/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java
new file mode 100644
index 0000000..b3e605e
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/annotations/DefaultValue.java
@@ -0,0 +1,35 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+
+/**
+ * Specify a default value for the column.
+ *
+ * This is used to generate the auto DDL.
+ *
+ * WARNING: This is not part of JPA 2.0 specification.
+ *
+ * @author 谢继雷
+ */
+@java.lang.annotation.Target({ FIELD, METHOD })
+@Retention(RUNTIME)
+public @interface DefaultValue {
+
+    /**
+     * The default value sql fragment.
+     *
+     * For string values, you need to quote the value like 'foo'.
+     *
+     * Because different database implementation may use different 
+     * quoting format, so this is not portable. But for simple values
+     * like number and strings, this is generally enough for use.
+     */
+    String value();
+
+}
diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
index b289b1e..ac57f1a 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3Column.java
@@ -29,6 +29,7 @@ import org.hibernate.AnnotationException;
 import org.hibernate.AssertionFailure;
 import org.hibernate.annotations.ColumnTransformer;
 import org.hibernate.annotations.ColumnTransformers;
+import org.hibernate.annotations.DefaultValue;
 import org.hibernate.annotations.common.reflection.XProperty;
 import org.hibernate.cfg.annotations.Nullability;
 import org.hibernate.mapping.Column;
@@ -65,6 +66,7 @@ public class Ejb3Column {
    private String propertyName;
    private boolean unique;
    private boolean nullable = true;
+   private String defaultValue;
    private String formulaString;
    private Formula formula;
    private Table table;
@@ -175,7 +177,15 @@ public class Ejb3Column {
        return mappingColumn.isNullable();
    }

-   public Ejb3Column() {
+   public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public Ejb3Column() {
    }

    public void bind() {
@@ -186,7 +196,7 @@ public class Ejb3Column {
        }
        else {
            initMappingColumn(
-                   logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, true
+                   logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, defaultValue, true
            );
            log.debug( "Binding column: " + toString());
        }
@@ -201,6 +211,7 @@ public class Ejb3Column {
            boolean nullable,
            String sqlType,
            boolean unique,
+           String defaultValue,
            boolean applyNamingStrategy) {
        if ( StringHelper.isNotEmpty( formulaString ) ) {
            this.formula = new Formula();
@@ -217,6 +228,7 @@ public class Ejb3Column {
            this.mappingColumn.setNullable( nullable );
            this.mappingColumn.setSqlType( sqlType );
            this.mappingColumn.setUnique( unique );
+           this.mappingColumn.setDefaultValue(defaultValue);

            if(writeExpression != null && !writeExpression.matches("[^?]*\\?[^?]*")) {
                throw new AnnotationException(
@@ -454,6 +466,11 @@ public class Ejb3Column {
                    else {
                        column.setLogicalColumnName( columnName );
                    }
+                   DefaultValue _defaultValue = inferredData.getProperty().getAnnotation(DefaultValue.class);
+                   if (_defaultValue != null) {
+                       String defaultValue = _defaultValue.value();
+                       column.setDefaultValue(defaultValue);
+                   }

                    column.setPropertyName(
                            BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
index e57636a..3d871f7 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/Ejb3JoinColumn.java
@@ -423,6 +424,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
                getMappingColumn() != null ? getMappingColumn().isNullable() : false,
                referencedColumn.getSqlType(),
                getMappingColumn() != null ? getMappingColumn().isUnique() : false,
+               null, // default-value
                false
        );
        linkWithValue( value );
@@ -502,6 +504,7 @@ public class Ejb3JoinColumn extends Ejb3Column {
                getMappingColumn().isNullable(),
                column.getSqlType(),
                getMappingColumn().isUnique(),
+               null, // default-value
                false //We do copy no strategy here
        );
        linkWithValue( value );

Nun, dies ist eine Lösung nur für den Ruhezustand.

Xiè Jìléi
quelle
2
Obwohl ich die Bemühungen von Personen schätze, die aktiv zum Open Source-Projekt beitragen, habe ich diese Antwort abgelehnt, da JPA eine Standard-Java-Spezifikation ist, die über OR / M hinausgeht. Das OP hat nach einer JPA-Methode gefragt, um Standardwerte anzugeben, und Ihr Patch funktioniert nur für den Ruhezustand. Wenn dies NHibernate wäre, in dem es keine Superpartes- Spezifikation für die Persistenz gibt (NPA wird von MS EF nicht einmal unterstützt), hätte ich eine solche Art von Patch positiv bewertet. Die Wahrheit ist, dass JPA im Vergleich zu den Anforderungen von ORM ziemlich begrenzt ist (ein Beispiel: keine Sekundärindizes). Wie auch immer, ein
großes Lob
Erzeugt dies kein Wartungsproblem? Müssen Sie diese Änderungen bei jedem Upgrade im Ruhezustand oder bei jeder Neuinstallation wiederholen?
user1242321
Da es sich bei der Frage um JPA handelt und Hibernate nicht einmal erwähnt wird, wird die Frage nicht beantwortet
Neil Stockton,
5
  1. @Column(columnDefinition='...') funktioniert nicht, wenn Sie beim Einfügen der Daten die Standardeinschränkung in der Datenbank festlegen.
  2. Sie müssen Anmerkungen erstellen insertable = falseund aus dieser entfernen columnDefinition='...', dann fügt die Datenbank automatisch den Standardwert aus der Datenbank ein.
  3. Wenn Sie beispielsweise das varchar-Geschlecht festlegen, ist es in der Datenbank standardmäßig männlich.
  4. Sie müssen nur insertable = falseHibernate / JPA hinzufügen , es wird funktionieren.
Appesh
quelle
Gute Antwort. Und hier ist erklären-über-einfügbar-falsch-aktualisierbar-falsch
Shihe Zhang
Und keine gute Option, wenn Sie den Wert manchmal festlegen möchten.
Shihe Zhang
@ShiheZhang mit false kann ich den Wert nicht festlegen?
fvildoso
3
@PrePersist
void preInsert() {
    if (this.dateOfConsent == null)
        this.dateOfConsent = LocalDateTime.now();
    if(this.consentExpiry==null)
        this.consentExpiry = this.dateOfConsent.plusMonths(3);
}

In meinem Fall wird dies aufgrund der Unabhängigkeit des Anbieters empfohlen, da das Feld LocalDateTime verwendet wird

Mohammed Rafeeq
quelle
2

Weder JPA- noch Hibernate-Annotationen unterstützen den Begriff eines Standardspaltenwerts. Um dieses Problem zu umgehen, legen Sie alle Standardwerte fest, bevor Sie einen Ruhezustand aufrufen save()oderupdate() die Sitzung . Dies ahmt das Verhalten der Datenbank nach, die beim Speichern einer Zeile in einer Tabelle Standardwerte festlegt (kurz bevor der Ruhezustand die Standardwerte festlegt).

Im Gegensatz zum Festlegen der Standardwerte in der Modellklasse, wie diese alternative Antwort vorschlägt, stellt dieser Ansatz auch sicher, dass Kriterienabfragen, die ein ExampleObjekt als Prototyp für die Suche verwenden, weiterhin wie zuvor funktionieren. Wenn Sie den Standardwert eines nullfähigen Attributs (eines Attributs mit einem nicht primitiven Typ) in einer Modellklasse festlegen, ignoriert eine Beispielabfrage im Ruhezustand die zugeordnete Spalte nicht mehr, wo sie zuvor ignoriert wurde, weil sie null war.

Derek Mahar
quelle
In der vorherigen Lösung erwähnte der Autor ColumnDefault ("")
nikolai.serdiuk
@ nikolai.serdiuk, dass die ColumnDefault-Annotation Jahre nach dem Schreiben dieser Antwort hinzugefügt wurde. Im Jahr 2010 war es richtig, es gab keine solche Annotation (tatsächlich gab es keine Annotationen, nur XML-Konfiguration).
Jwenting
1

Dies ist in JPA nicht möglich.

Mit der Spaltenanmerkung können Sie Folgendes tun: http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html

PEELY
quelle
1
Die Nichtangabe eines Standardwerts scheint ein schwerwiegender Mangel der JPA-Anmerkungen zu sein.
Derek Mahar
2
JDO erlaubt es in seiner ORM-Definition, daher sollte JPA dies einschließen ... eines Tages
user383680
Sie können es definitiv mit dem Attribut columnDefinition tun, wie Cameron Pope antwortete.
IntelliData
@DerekMahar ist nicht der einzige Mangel in der JPA-Spezifikation. Es ist eine gute Beschreibung, aber es ist nicht perfekt
jwenting
1

Wenn Sie ein Double verwenden, können Sie Folgendes verwenden:

@Column(columnDefinition="double precision default '96'")

private Double grolsh;

Ja, es ist db-spezifisch.

Gal Bracha
quelle
0

Sie können den Standardwert im Datenbankdesigner oder beim Erstellen der Tabelle definieren. In SQL Server können Sie beispielsweise den Standard-Tresor eines Datumsfelds auf ( getDate()) setzen. Verwenden Sie diese insertable=falsewie in Ihrer Spaltendefinition angegeben. JPA gibt diese Spalte in Einfügungen nicht an und die Datenbank generiert den Wert für Sie.

Dave Anderson
quelle
-2

Sie müssen insertable=falsein Ihrer @ColumnAnmerkung. JPA ignoriert dann diese Spalte beim Einfügen in die Datenbank und der Standardwert wird verwendet.

Siehe diesen Link: http://mariemjabloun.blogspot.com/2014/03/resolved-set-database-default-value-in.html

MariemJab
quelle
2
Wie fügst du dann den angegebenen Wert @runtime ein?
Ashish Ratan
Ja, das ist wahr. nullable=falsewird mit einem scheitern SqlException: Caused by: java.sql.SQLException: Column 'opening_times_created' cannot be null. Hier habe ich vergessen, den "erstellten" Zeitstempel mit zu setzen openingTime.setOpeningCreated(new Date()). Dies ist eine gute Art, Konsistenz zu haben, aber das hat der Fragesteller nicht gefragt.
Roland