Установка значений по умолчанию для столбцов в JPA

Можно ли установить значение по умолчанию для столбцов в JPA, и если, то как это делается с помощью аннотаций?


person homaxto    schedule 13.10.2008    source источник
comment
есть ли в сепсификации JPA, где я могу поставить значение по умолчанию для столбца в качестве значения для другого столбца, потому что я хочу, чтобы он был скрыт   -  person shareef    schedule 08.08.2016
comment
Связано: Hibernate имеет @ org.hibernate.annotations .ColumnDefault (foo)   -  person Ondra Žižka    schedule 10.02.2017
comment
Если вы используете columnDefinition или @ColumnDefault, рекомендуется придерживаться стандартных типов. dba.stackexchange.com/questions/53317/ < / а>.   -  person Oliver    schedule 22.01.2021


Ответы (17)


На самом деле это возможно в JPA, хотя это небольшая хитрость с использованием свойства columnDefinition аннотации @Column, например:

@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
person Cameron Pope    schedule 17.12.2008
comment
Десятичный (10,2), что означает 10 и 2? - person Schildmeijer; 09.04.2009
comment
10 - это целая часть, а 2 - десятичная часть числа, поэтому 1234567890.12 будет поддерживаемым числом. - person Nathan Feger; 08.05.2009
comment
Также обратите внимание, что это columnDefinition не обязательно зависит от базы данных и, конечно же, не привязано автоматически к типу данных в Java. - person Nathan Feger; 08.05.2009
comment
После создания объекта с пустым полем и его сохранения у вас не будет установленного в нем значения. Не выход ... - person Pascal Thivent; 12.07.2010
comment
Нет @NathanFeger, 10 - длина, а 2 - десятичная часть. Таким образом, 1234567890.12 не будет поддерживаемым номером, но 12345678.90 действителен. - person GPrimola; 11.03.2014
comment
@GPrimola Спасибо за указание на этот бесценный факт, чувак, я чуть не облысел, задаваясь вопросом, почему мой десятичный 50.22 выдает ошибку усечения данных в определении DECIMAL(2,2) столбца. +1 - person qualebs; 18.03.2014
comment
Хотя это не зависит от базы данных, преимущество использования этого подхода заключается в том, что столбец добавляется после развертывания приложения в производственной среде (автоматическое обновление ddl включено). Таким образом, существующая строка будет иметь значение по умолчанию, заполненное при обновлении базы данных. - person gerrytan; 07.11.2014
comment
Вам понадобится insertable=false, если столбец допускает значение NULL (и чтобы избежать ненужного аргумента столбца). - person eckes; 07.08.2015
comment
Общий JPA (javax.persistence пакеты) представляет собой перекрестную реализацию JPA и перекрестную реализацию диалекта SQL / СУБД. Не все могут понять, например, DEFAULT CURRENT_TIMESTAMP. columnDefinition может быть устаревшим в пользу упомянутых выше взаимозависимостей. - person Roland; 14.10.2017
comment
Это лучший способ при создании нового столбца в существующей таблице! - person Sherzod; 07.06.2021

Вы можете сделать следующее:

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

Там! Вы только что использовали ноль в качестве значения по умолчанию.

Обратите внимание, что это будет полезно, если вы обращаетесь к базе данных только из этого приложения. Если другие приложения также используют базу данных, вам следует выполнить эту проверку из базы данных, используя атрибут аннотации Кэмерона columnDefinition или каким-либо другим способом.

person Pablo Venturino    schedule 18.06.2009
comment
Это правильный способ сделать это, если вы хотите, чтобы ваши объекты имели правильное значение после вставки. +1 - person Pascal Thivent; 12.07.2010
comment
Установка значения по умолчанию для атрибута, допускающего значение NULL (тот, который имеет непримитивный тип) в классе модели, нарушит запросы критериев, которые используют объект Example в качестве прототипа для поиска. После установки значения по умолчанию пример запроса Hibernate больше не будет игнорировать связанный столбец, тогда как раньше он игнорировал его, потому что он был пустым. Лучше всего установить все значения по умолчанию непосредственно перед вызовом Hibernate save() или update(). Это лучше имитирует поведение базы данных, которая устанавливает значения по умолчанию при сохранении строки. - person Derek Mahar; 03.08.2010
comment
@Harry: это правильный способ установить значения по умолчанию, за исключением случаев, когда вы используете критерии критериев, которые используют пример в качестве прототипа для поиска. - person Derek Mahar; 28.08.2010
comment
Это не гарантирует, что значение по умолчанию будет установлено для непримитивных типов (например, установка null). Использование @PrePersist и @PreUpdate - лучший вариант imho. - person Jasper; 05.10.2011
comment
Я бы использовал значения по умолчанию при инициализации для простых случаев / простых типов. В более сложных случаях (например, когда значение по умолчанию каким-то образом вычисляется во время выполнения) используется @PrePersist. Тем не менее, оба способа хороши, ИМО. - person Piotr Nowicki; 08.06.2012
comment
Это правильный способ указать значение по умолчанию для столбца. Свойство columnDefinition не зависит от базы данных и @PrePersist переопределяет ваш параметр перед вставкой, значение по умолчанию - другое, значение по умолчанию используется, когда значение не установлено явно. - person Utku Özdemir; 26.02.2014
comment
Может быть, установить их в статическом инициализаторе / конструкторе, чтобы объявление и инициализация были разделены? Я обычно так и держу. - person Roland; 02.11.2017

другой подход - использование javax.persistence.PrePersist

@PrePersist
void preInsert() {
   if (this.createdTime == null)
       this.createdTime = new Date();
}
person Husin Wijaya    schedule 17.11.2012
comment
Я использовал такой подход для добавления и обновления временных меток. Это сработало очень хорошо. - person Spina; 15.08.2013
comment
Разве это не должно быть if (createdt != null) createdt = new Date(); или что-то в этом роде? Прямо сейчас это переопределит явно указанное значение, что, похоже, не делает его значением по умолчанию. - person Max Nanasy; 26.11.2014
comment
@MaxNanasy if (createdt == null) createdt = new Date(); - person Shane; 16.12.2014
comment
Будет ли иметь значение, если клиент и база данных находятся в разных часовых поясах? Я предполагаю, что использование чего-то вроде TIMESTAMP DEFAULT CURRENT_TIMESTAMP получит текущее время на сервере базы данных, а createdt = new Date () получит текущее время в java-коде, но эти два раза могут быть разными, если клиент подключается на сервер в другом часовом поясе. - person FrustratedWithFormsDesigner; 16.03.2015
comment
Добавлена ​​проверка null. - person Ondra Žižka; 02.10.2017
comment
Мне нравится этот b / c, он позволяет новым объектам сначала иметь нулевые значения вместо значения по умолчанию для БД. - person Adam B; 01.03.2019

В 2017 году в JPA 2.1 по-прежнему есть только @Column(columnDefinition='...'), в который вы помещаете буквальное определение столбца SQL. Это довольно негибко и вынуждает вас также объявлять другие аспекты, такие как тип, сокращая точку зрения реализации JPA по этому вопросу.

Однако в Hibernate есть следующее:

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

Определяет значение DEFAULT для применения к связанному столбцу через DDL.

Два примечания к этому:

1) Не бойтесь нестандартных решений. Работая разработчиком JBoss, я видел довольно много процессов спецификации. Спецификация - это, по сути, базовый уровень, который крупные игроки в данной области готовы поддержать в течение следующего десятилетия или около того. Это верно для безопасности, для обмена сообщениями ORM не имеет значения (хотя JPA охватывает довольно много). Мой опыт как разработчика показывает, что в сложном приложении рано или поздно вам все равно понадобится нестандартный API. И @ColumnDefault - пример, когда он перевешивает недостатки использования нестандартного решения.

2) Приятно, как все машут @PrePersist или инициализацией члена конструктора. Но это НЕ то же самое. Как насчет массовых обновлений SQL? Как насчет утверждений, которые не устанавливают столбец? DEFAULT выполняет свою роль, и ее нельзя заменить инициализацией члена класса Java.

person Ondra Žižka    schedule 10.02.2017
comment
Какую версию hibernate-annotations я могу использовать для Wildfly 12, я обнаружил ошибку с конкретной версией этого? Спасибо заранее! - person Fernando Pie; 13.11.2018
comment
Спасибо, Ондра. Есть ли еще какие-то решения в 2019 году? - person Alan; 15.05.2019
comment
@Alan, к сожалению, нет в наличии JPA. - person jwenting; 04.09.2019
comment
Это грустно. Чтобы получить значение по умолчанию, вы должны подключить определенный тип данных RDMBS. - person granadaCoder; 23.03.2021

JPA не поддерживает это, и было бы полезно, если бы это было так. Использование columnDefinition зависит от БД и во многих случаях неприемлемо. установки значения по умолчанию в классе недостаточно, когда вы извлекаете запись, имеющую нулевые значения (что обычно происходит при повторном запуске старых тестов DBUnit). Что я делаю, так это:

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.

person Community    schedule 12.04.2010
comment
Не злоупотребляйте сеттерами! Они предназначены для установки параметра в поле объекта. Больше ничего! Лучше использовать конструктор по умолчанию для значений по умолчанию. - person Roland; 14.10.2017
comment
@Roland хорош в теории, но не всегда будет работать при работе с существующей базой данных, которая уже содержит нулевые значения, где ваше приложение не хотело бы их иметь. Сначала вам нужно будет выполнить преобразование базы данных, где вы сделаете столбец ненулевым и в то же время установите разумное значение по умолчанию, а затем справитесь с отрицательной реакцией других приложений, которые предполагают, что он фактически допускает значение NULL (то есть, если вы можно даже изменить базу данных). - person jwenting; 04.09.2019
comment
Если дело доходит до #JPA и сеттеров / получателей, они всегда должны быть чистыми сеттерами / получателями, иначе однажды ваше приложение вырастет и разрастется и станет кошмаром для обслуживания. Лучший совет - KISS здесь (я не гей, LOL). - person Roland; 22.11.2019

Видя, как я наткнулся на это в Google, пытаясь решить ту же проблему, я просто добавлю решение, которое я приготовил, на случай, если кто-то сочтет его полезным.

На мой взгляд, реально существует только одно решение этой проблемы - @PrePersist. Если вы сделаете это в @PrePersist, вы должны проверить, установлено ли уже значение.

person TC1    schedule 12.11.2010
comment
+1 - Я бы определенно выбрал @PrePersist для использования OP. @Column(columnDefinition=...) не кажется очень элегантным. - person Piotr Nowicki; 08.06.2012
comment
@PrePersist не поможет, если в магазине уже есть данные с нулевыми значениями. Он не сделает за вас преобразование базы данных волшебным образом. - person jwenting; 04.09.2019

@Column(columnDefinition="tinyint(1) default 1")

Я только что проверил проблему. Работает отлично. Спасибо за подсказку.


О комментариях:

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

Этот не устанавливает значение столбца по умолчанию в базе данных (конечно).

person asd    schedule 31.03.2010
comment
Это не работает нормально на уровне объекта (вы не получите значение по умолчанию для базы данных после вставки в вашу сущность). По умолчанию на уровне Java. - person Pascal Thivent; 12.07.2010
comment
Он работает (особенно, если вы укажете insertable = false в базе данных, но, к сожалению, кешированная версия не обновляется (даже когда JPA выбирает таблицу и столбцы). По крайней мере, не с hibernate: - /, но даже если бы сработал дополнительный туда и обратно плохо. - person eckes; 07.08.2015

вы можете использовать java Reflect api:

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

Это обычное дело:

    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();
            }
        }
    }
person Thomas Zhang    schedule 05.04.2016
comment
Мне нравится это решение, но у меня есть одна слабость, я думаю, было бы важно проверить, допускает ли столбец значение NULL перед установкой значения по умолчанию. - person Luis Carlos; 31.05.2017
comment
Если вы предпочитаете, можно также поместить код из Field[] fields = object.getClass().getDeclaredFields(); в for(). А также добавьте final в свой параметр / перехваченные исключения, так как вы не хотите, чтобы object было случайно изменено. Также добавьте чек на null: if (null == object) { throw new NullPointerException("Parameter 'object' is null"); }. Это гарантирует, что object.getClass() безопасно вызывать и не вызывает NPE. Причина в том, чтобы избежать ошибок ленивых программистов. ;-) - person Roland; 02.11.2017

Я использую columnDefinition, и он очень хорошо работает

@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

private Date createdDate;
person Tong    schedule 05.01.2012
comment
Похоже, это делает вашу реализацию jpa специфичной для поставщика. - person Udo Held; 06.01.2012
comment
Это только делает конкретного поставщика DDL. Но у вас, скорее всего, есть взломы DDL, специфичные для поставщика. Однако, как упоминалось выше, значение (даже если insertable = false) отображается в БД, но не в кеше сущностей сеанса (по крайней мере, не в спящем режиме). - person eckes; 07.08.2015

Вы не можете сделать это с аннотацией столбца. Я думаю, что единственный способ - установить значение по умолчанию при создании объекта. Возможно, конструктор по умолчанию будет подходящим местом для этого.

person Timo    schedule 06.12.2008
comment
Хорошая идея. К сожалению, для @Column нет общей аннотации или атрибута. И еще мне не хватает комментариев (взятых из документа Java). - person Roland; 14.10.2017

В моем случае я модифицировал исходный код hibernate-core, ну, чтобы ввести новую аннотацию @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 谢继雷
+ */
[email protected]({ 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 );

Что ж, это решение только для гибернации.

person Xiè Jìléi    schedule 21.12.2011
comment
Хотя я ценю усилия людей, которые активно участвуют в проекте с открытым исходным кодом, я проголосовал против этого ответа, потому что JPA - это стандартная спецификация Java поверх любого OR / M, OP запросил способ JPA для указания значений по умолчанию, и ваш патч работает только для Hibernate. Если бы это был NHibernate, в котором нет спецификации super-partes для устойчивости (NPA даже не поддерживается MS EF), я бы поддержал такой патч. Правда в том, что JPA довольно ограничен по сравнению с требованиями ORM (один пример: нет вторичных индексов). В любом случае честь усилиям - person usr-local-ΕΨΗΕΛΩΝ; 02.08.2013
comment
Не вызывает ли это проблем с обслуживанием? Придется ли повторять эти изменения при обновлении спящего режима или при каждой новой установке? - person user1242321; 10.05.2016
comment
Поскольку вопрос касается JPA, а Hibernate даже не упоминается, это не отвечает на вопрос - person Neil Stockton; 05.05.2017

  1. @Column(columnDefinition='...') не работает, если вы устанавливаете ограничение по умолчанию в базе данных при вставке данных.
  2. Вам нужно сделать insertable = false и удалить columnDefinition='...' из аннотации, тогда база данных автоматически вставит значение по умолчанию из базы данных.
  3. Например. когда вы устанавливаете пол varchar по умолчанию в базе данных мужской.
  4. Вам просто нужно добавить insertable = false в Hibernate / JPA, это сработает.
person Appesh    schedule 27.06.2017
comment
Хороший ответ. А вот объяснение-о-вставке-ложь-обновление-ложь - person Shihe Zhang; 12.06.2018
comment
И не лучший вариант, если вы хотите иногда установить его значение. - person Shihe Zhang; 12.06.2018
comment
@ShiheZhang с использованием false не позволяет мне установить значение? - person fvildoso; 06.11.2019

@PrePersist
void preInsert() {
    if (this.dateOfConsent == null)
        this.dateOfConsent = LocalDateTime.now();
    if(this.consentExpiry==null)
        this.consentExpiry = this.dateOfConsent.plusMonths(3);
}

В моем случае из-за того, что поле LocalDateTime, я использовал это, рекомендуется из-за независимости от поставщика.

person Mohammed Rafeeq    schedule 11.10.2017

Это невозможно в JPA.

Вот что вы можете делать с аннотацией столбца: http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html

person PEELY    schedule 13.10.2008
comment
Невозможность указать значение по умолчанию кажется серьезным недостатком аннотаций JPA. - person Derek Mahar; 14.06.2010
comment
JDO допускает это в своем определении ORM, поэтому JPA должен включить это ... однажды - person user383680; 03.10.2010
comment
Вы определенно можете сделать это с помощью атрибута columnDefinition, как ответил Кэмерон Поуп. - person IntelliData; 19.02.2016
comment
@DerekMahar - это не единственный недостаток спецификации JPA. Характеристики хорошие, но не идеальные. - person jwenting; 04.09.2019

Ни JPA, ни аннотации Hibernate не поддерживают понятие значения столбца по умолчанию. В качестве обходного пути к этому ограничению установите все значения по умолчанию непосредственно перед вызовом спящего режима save() или update() в сеансе. Это максимально близко (за исключением Hibernate, устанавливающего значения по умолчанию) имитирует поведение базы данных, которая устанавливает значения по умолчанию при сохранении строки в таблице.

В отличие от установки значений по умолчанию в классе модели в качестве этого альтернативного ответа предполагает, что этот подход также гарантирует, что запросы критериев, использующие объект Example в качестве прототипа для поиска, будут продолжать работать, как и раньше. Когда вы устанавливаете значение по умолчанию для атрибута, допускающего значение NULL (тот, который имеет непримитивный тип) в классе модели, запрос Hibernate по примеру больше не будет игнорировать связанный столбец, где раньше он игнорировал бы его, потому что он был пустым.

person Derek Mahar    schedule 03.08.2010
comment
В предыдущем решении автор использовал ColumnDefault () - person nikolai.serdiuk; 18.05.2017
comment
@ nikolai.serdiuk, что аннотация ColumnDefault была добавлена ​​спустя годы после написания этого ответа. В 2010 году это было правильно, такой аннотации не было (по сути аннотации не было, только конфигурация xml). - person jwenting; 04.09.2019

Если вы используете двойной, вы можете использовать следующее:

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

private Double grolsh;

Да, это зависит от БД.

person Gal Bracha    schedule 08.02.2012

Вы можете определить значение по умолчанию в дизайнере базы данных или при создании таблицы. Например, в SQL Server вы можете установить для хранилища по умолчанию поля даты значение (getDate()). Используйте insertable=false, как указано в определении столбца. JPA не будет указывать этот столбец во вставках, и база данных сгенерирует значение для вас.

person Dave Anderson    schedule 03.03.2016