Đặt giá trị mặc định cho các cột trong JPA


245

Có thể đặt giá trị mặc định cho các cột trong JPA không và nếu được thực hiện bằng cách sử dụng chú thích?


Có phải trong phân tách JPA nơi tôi có thể đặt giá trị mặc định cho một cột làm giá trị cho một cột khác không, vì tôi muốn nó bị ẩn
shareef 8/8/2016

Câu trả lời:


230

Trên thực tế có thể có trong JPA, mặc dù một chút hack sử dụng thuộc columnDefinitiontính của @Columnchú thích, ví dụ:

@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")

3
10 là phần nguyên và 2 là phần thập phân của số nên: 1234567890.12 sẽ là số được hỗ trợ.
Nathan Feger

23
Cũng lưu ý, cột Định nghĩa này không nhất thiết là cơ sở dữ liệu độc lập và chắc chắn không tự động ràng buộc kiểu dữ liệu trong Java.
Nathan Feger

47
Sau khi tạo một thực thể với trường null và duy trì nó, bạn sẽ không đặt giá trị trong đó. Không phải là một giải pháp ...
Pascal Thivent

18
Không có @NathanFeger, 10 là chiều dài và 2 phần thập phân. Vì vậy, 1234567890.12 không phải là số được hỗ trợ, nhưng 12345678.90 là hợp lệ.
GPrimola

4
Bạn sẽ cần insertable=falsenếu cột là nullable (và để tránh đối số cột không cần thiết).
eckes

314

Bạn có thể làm như sau:

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

Đó! Bạn vừa sử dụng số 0 làm giá trị mặc định.

Lưu ý điều này sẽ phục vụ bạn nếu bạn chỉ truy cập cơ sở dữ liệu từ ứng dụng này. Nếu các ứng dụng khác cũng sử dụng cơ sở dữ liệu, thì bạn nên thực hiện kiểm tra này từ cơ sở dữ liệu bằng cách sử dụng thuộc tính chú thích Định nghĩa cột của Cameron hoặc một số cách khác.


38
Đây là cách đúng để làm điều đó nếu bạn muốn các thực thể của mình có giá trị chính xác sau khi chèn. +1
Pascal Thivent

16
Đặt giá trị mặc định của thuộc tính nullable (thuộc tính có kiểu không nguyên thủy) trong lớp mô hình sẽ phá vỡ các tiêu chí truy vấn sử dụng một Exampleđối tượng làm nguyên mẫu cho tìm kiếm. Sau khi đặt giá trị mặc định, truy vấn ví dụ Hibernate sẽ không còn bỏ qua cột được liên kết mà trước đó nó sẽ bỏ qua nó vì nó là null. Cách tiếp cận tốt hơn là đặt tất cả các giá trị mặc định ngay trước khi gọi Hibernate save()hoặc update(). Điều này tốt hơn bắt chước hành vi của cơ sở dữ liệu đặt các giá trị mặc định khi nó lưu một hàng.
Derek Mahar

1
@Harry: Đây là cách chính xác để đặt giá trị mặc định trừ khi bạn đang sử dụng các truy vấn tiêu chí sử dụng một ví dụ làm nguyên mẫu cho tìm kiếm.
Derek Mahar

12
Điều này không đảm bảo rằng mặc định được đặt cho các loại không nguyên thủy ( nullví dụ: cài đặt ). Sử dụng @PrePersist@PreUpdatelà một lựa chọn tốt hơn imho.
Jasper

3
Đây là cách đúng để chỉ định giá trị mặc định cho cột. columnDefinitionthuộc tính không độc lập với cơ sở dữ liệu và @PrePersistghi đè cài đặt của bạn trước khi chèn, "giá trị mặc định" là một thứ khác, giá trị mặc định được sử dụng khi giá trị không được đặt rõ ràng.
Utku zdemir

110

một cách tiếp cận khác là sử dụng javax.persistence.PrePersist

@PrePersist
void preInsert() {
   if (this.createdTime == null)
       this.createdTime = new Date();
}

1
Tôi đã sử dụng một cách tiếp cận như thế này để thêm và cập nhật dấu thời gian. Nó làm việc rất tốt.
Spina

10
Điều này không nên if (createdt != null) createdt = new Date();hay sao? Ngay bây giờ, điều này sẽ ghi đè một giá trị được chỉ định rõ ràng, dường như làm cho nó không thực sự là một mặc định.
Max Nanasy

16
@MaxNanasyif (createdt == null) createdt = new Date();
Shane

Sẽ có vấn đề gì nếu máy khách và cơ sở dữ liệu ở các múi giờ khác nhau? Tôi tưởng tượng rằng việc sử dụng cái gì đó như "TIMESTAMP DEFAULT CURRENT_TIMESTAMP" sẽ có được thời gian hiện tại trên máy chủ cơ sở dữ liệu và "createdt = new Date ()" sẽ có được thời gian hiện tại trong mã java, nhưng hai lần này có thể không giống nhau nếu máy khách đang kết nối với máy chủ theo múi giờ khác.
Thất

Đã thêm nullkiểm tra.
Ondra ižka

49

Trong năm 2017, JPA 2.1 vẫn chỉ @Column(columnDefinition='...')có bạn đặt định nghĩa SQL theo nghĩa đen của cột. Điều này khá không linh hoạt và buộc bạn cũng phải khai báo các khía cạnh khác như kiểu, làm ngắn mạch quan điểm của việc triển khai JPA về vấn đề đó.

Hibernate mặc dù, có điều này:

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

Xác định giá trị DEFAULT để áp dụng cho cột được liên kết thông qua DDL.

Hai lưu ý rằng:

1) Đừng sợ đi không chuẩn. Làm việc như một nhà phát triển JBoss, tôi đã thấy khá nhiều quy trình đặc tả. Thông số kỹ thuật về cơ bản là cơ sở mà các cầu thủ lớn trong lĩnh vực nhất định sẵn sàng cam kết hỗ trợ trong thập kỷ tới hoặc lâu hơn. Điều đó đúng với bảo mật, đối với nhắn tin, ORM không có gì khác biệt (mặc dù JPA bao gồm khá nhiều). Kinh nghiệm của tôi với tư cách là một nhà phát triển là trong một ứng dụng phức tạp, sớm hay muộn bạn cũng sẽ cần một API không chuẩn. Và @ColumnDefaultlà một ví dụ khi nó vượt xa các tiêu cực của việc sử dụng một giải pháp không chuẩn.

2) Thật tuyệt khi mọi người vẫy tay khởi tạo thành viên @PrePersist hoặc constructor. Nhưng điều đó KHÔNG giống nhau. Làm thế nào về cập nhật SQL số ​​lượng lớn? Làm thế nào về các báo cáo không đặt cột? DEFAULTcó vai trò của nó và điều đó không thể thay thế bằng cách khởi tạo một thành viên lớp Java.


Tôi có thể sử dụng phiên bản chú thích ngủ đông nào cho Wildfly 12, tôi gặp lỗi với phiên bản cụ thể này? Cảm ơn ind trước!
Fernando Pie

Cảm ơn Ondra. Có giải pháp nào nữa trong năm 2019 không?
Alan

1
@Alan không có trong kho JPA, thật đáng buồn.
jwenting

13

JPA không hỗ trợ điều đó và nó sẽ hữu ích nếu có. Sử dụng cộtDefDef là DB cụ thể và không được chấp nhận trong nhiều trường hợp. thiết lập mặc định trong lớp là không đủ khi bạn truy xuất một bản ghi có giá trị null (điều này thường xảy ra khi bạn chạy lại các bài kiểm tra DBUnit cũ). Những gì tôi làm là thế này:

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 tự động đấm bốc giúp rất nhiều trong đó.


Đừng lạm dụng setters! Chúng là để thiết lập một tham số trong trường đối tượng. Chỉ có bấy nhiêu thôi! Sử dụng tốt hơn xây dựng mặc định cho các giá trị mặc định.
Roland

@Roland về mặt lý thuyết, nhưng sẽ không luôn hoạt động khi xử lý cơ sở dữ liệu hiện có chứa các giá trị null trong đó ứng dụng của bạn muốn không có chúng. Trước tiên, bạn cần thực hiện chuyển đổi cơ sở dữ liệu trong đó bạn tạo cột không rỗng và đặt mặc định hợp lý cùng một lúc, sau đó xử lý phản ứng ngược từ các ứng dụng khác giả sử trên thực tế là không thể (nghĩa là, nếu bạn thậm chí có thể sửa đổi cơ sở dữ liệu).
jwenting

Nếu nói đến #JPA và setters / getters, chúng phải luôn là setter / getter thuần túy vào một ngày nào đó, ứng dụng của bạn đã phát triển và lớn mạnh và trở thành một cơn ác mộng bảo trì. Lời khuyên tốt nhất là KISS ở đây (Tôi không đồng tính, LOL).
Roland

10

Thấy tôi vấp phải điều này từ Google trong khi cố gắng giải quyết vấn đề tương tự, tôi sẽ đưa ra giải pháp tôi đã nấu trong trường hợp ai đó thấy nó hữu ích.

Theo quan điểm của tôi, thực sự chỉ có 1 giải pháp cho vấn đề này - @PrePersist. Nếu bạn làm điều đó trong @PrePersist, bạn phải kiểm tra xem giá trị đã được đặt chưa.


4
+1 - Tôi chắc chắn sẽ chọn tham gia chương @PrePersisttrình usecase của OP. @Column(columnDefinition=...)không có vẻ rất thanh lịch.
Piotr Nowicki

@PrePersist sẽ không giúp bạn nếu đã có dữ liệu trong cửa hàng với các giá trị null. Nó sẽ không thực sự chuyển đổi cơ sở dữ liệu cho bạn.
jwenting

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

Tôi chỉ thử nghiệm vấn đề. Nó hoạt động tốt. Cảm ơn đã gợi ý.


Về các ý kiến:

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

Điều này không đặt giá trị cột mặc định trong cơ sở dữ liệu (tất nhiên).


9
Nó không hoạt động tốt ở cấp đối tượng (bạn sẽ không nhận được giá trị mặc định của cơ sở dữ liệu sau khi chèn vào thực thể của bạn). Mặc định ở cấp Java.
Pascal Thivent

Nó hoạt động (đặc biệt là nếu bạn chỉ định insertable = false vào cơ sở dữ liệu, nhưng không may là phiên bản được lưu trong bộ nhớ cache không được làm mới (ngay cả khi JPA chọn bảng và cột). roundtrip là xấu.
eckes

9

bạn có thể sử dụng java phản ánh api:

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

Điều này là phổ biến:

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

2
Tôi thích giải pháp này, nhưng có một điểm yếu, tôi nghĩ rằng đó sẽ là kiểm tra quan trọng nếu cột có thể rỗng hay không trước khi đặt giá trị mặc định.
Luis Carlos

Nếu bạn thích, đặt mã từ Field[] fields = object.getClass().getDeclaredFields();vào cũng for()có thể ổn. Và cũng thêm finalvào tham số / ngoại lệ bị bắt vì bạn không muốn objectbị sửa đổi do tai nạn. Ngoài ra, thêm một kiểm tra về null: if (null == object) { throw new NullPointerException("Parameter 'object' is null"); }. Điều đó đảm bảo rằng object.getClass()an toàn để gọi và không kích hoạt a NPE. Lý do là để tránh những sai lầm của các lập trình viên lười biếng. ;-)
Roland

7

Tôi sử dụng columnDefinitionvà nó hoạt động rất tốt

@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

private Date createdDate;

6
Điều này có vẻ như nó làm cho nhà cung cấp thực hiện jpa của bạn cụ thể.
Udo tổ chức

Nó chỉ làm cho nhà cung cấp DDL cụ thể. Nhưng dù sao bạn cũng có khả năng hack DDL cụ thể của nhà cung cấp .. Tuy nhiên, như đã đề cập ở trên, giá trị (ngay cả khi insertable = false) hiển thị trong DB nhưng không có trong bộ đệm thực thể của phiên (ít nhất là không ở chế độ ngủ đông).
eckes

7

Bạn không thể làm điều này với chú thích cột. Tôi nghĩ cách duy nhất là đặt giá trị mặc định khi một đối tượng được tạo. Có lẽ các nhà xây dựng mặc định sẽ là nơi thích hợp để làm điều đó.


Ý kiến ​​hay. Đáng buồn thay, không có chú thích chung hoặc thuộc tính cho @Columnxung quanh. Và tôi cũng bỏ lỡ các bình luận được đặt (lấy từ tài liệu Java).
Roland

5

Trong trường hợp của tôi, tôi đã sửa đổi mã nguồn lõi ngủ đông để giới thiệu một chú thích mới @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 );

Vâng, đây là một giải pháp chỉ ngủ đông.


2
Mặc dù tôi đánh giá cao nỗ lực của những người đóng góp tích cực cho dự án nguồn mở, tôi đã đánh giá thấp câu trả lời này vì JPA là một đặc tả Java tiêu chuẩn trên bất kỳ OR / M nào, OP đã yêu cầu một cách JPA để chỉ định các giá trị mặc định và bản vá của bạn hoạt động chỉ dành cho Hibernate. Nếu đây là NHibernate, trong đó không có đặc điểm kỹ thuật siêu phân chia cho sự bền bỉ (NPA thậm chí không được MS EF hỗ trợ), tôi sẽ nâng cấp loại bản vá như vậy. Sự thật là JPA khá hạn chế so với các yêu cầu của ORM (một ví dụ: không có chỉ số phụ). Dù sao đi nữa, nỗ lực
usr-local-ΕΨΗΕΛΩΝ

Điều này không tạo ra một vấn đề bảo trì? Người ta sẽ cần phải làm lại những thay đổi này bất cứ khi nào nâng cấp ngủ đông hoặc trên mỗi cài đặt mới?
dùng1242321

Vì câu hỏi là về JPA và Hibernate thậm chí không được đề cập, nên điều này không trả lời câu hỏi
Neil Stockton

5
  1. @Column(columnDefinition='...') không hoạt động khi bạn đặt ràng buộc mặc định trong cơ sở dữ liệu trong khi chèn dữ liệu.
  2. Bạn cần tạo insertable = falsevà xóa columnDefinition='...'khỏi chú thích, sau đó cơ sở dữ liệu sẽ tự động chèn giá trị mặc định từ cơ sở dữ liệu.
  3. Ví dụ: khi bạn đặt varchar giới tính là nam theo mặc định trong cơ sở dữ liệu.
  4. Bạn chỉ cần thêm insertable = falsevào Hibernate / JPA, nó sẽ hoạt động.


Và không phải là một lựa chọn tốt, nếu bạn muốn đặt giá trị của nó đôi khi.
Shihe Zhang

@ShiheZhang sử dụng false không cho phép tôi đặt giá trị?
fvildoso

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

Trong trường hợp của tôi do trường là LocalDateTime tôi đã sử dụng, trường này được khuyến nghị do tính độc lập của nhà cung cấp


2

Cả chú thích JPA và Hibernate đều không hỗ trợ khái niệm giá trị cột mặc định. Để khắc phục hạn chế này, hãy đặt tất cả các giá trị mặc định ngay trước khi bạn gọi Hibernate save()hoặc update()trên phiên. Điều này càng chặt chẽ càng tốt (viết tắt là Hibernate thiết lập các giá trị mặc định) bắt chước hành vi của cơ sở dữ liệu đặt các giá trị mặc định khi nó lưu một hàng trong bảng.

Không giống như đặt các giá trị mặc định trong lớp mô hình như câu trả lời thay thế này cho thấy, cách tiếp cận này cũng đảm bảo rằng các truy vấn tiêu chí sử dụng một Exampleđối tượng làm nguyên mẫu cho tìm kiếm sẽ tiếp tục hoạt động như trước. Khi bạn đặt giá trị mặc định của thuộc tính nullable (thuộc tính có kiểu không nguyên thủy) trong lớp mô hình, ví dụ truy vấn Hibernate sẽ không còn bỏ qua cột được liên kết mà trước đó nó sẽ bỏ qua vì nó là null.


Trong giải pháp trước đây, tác giả đã chia sẻ CộtDefault ("")
nikolai.serdiuk

@ nikolai.serdiuk rằng chú thích CộtDefault đã được thêm nhiều năm sau khi câu trả lời này được viết. Năm 2010 đã đúng, không có chú thích nào như vậy (thực tế không có chú thích, chỉ có cấu hình xml).
jwenting

1

Điều này là không thể trong JPA.

Đây là những gì bạn có thể làm với chú thích Cột: http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html


1
Không thể chỉ định một giá trị mặc định có vẻ là một thiếu sót nghiêm trọng của các chú thích JPA.
Derek Mahar

2
JDO cho phép nó trong định nghĩa ORM của nó, vì vậy JPA phải bao gồm ... một ngày
dùng383680

Bạn chắc chắn có thể làm điều đó, với thuộc tính cộtDefDef, như Cameron Pope đã trả lời.
IntelliData

@DerekMahar nó không phải là thiếu sót duy nhất trong đặc tả JPA. Đó là một đặc điểm kỹ thuật tốt, nhưng nó không hoàn hảo
jwenting

1

Nếu bạn đang sử dụng gấp đôi, bạn có thể sử dụng như sau:

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

private Double grolsh;

Vâng, đó là db cụ thể.


0

Bạn có thể xác định giá trị mặc định trong trình thiết kế cơ sở dữ liệu hoặc khi bạn tạo bảng. Chẳng hạn, trong SQL Server, bạn có thể đặt vault mặc định của trường Ngày thành ( getDate()). Sử dụng insertable=falsenhư được đề cập trong định nghĩa cột của bạn. JPA sẽ không chỉ định cột đó khi chèn và cơ sở dữ liệu sẽ tạo ra giá trị cho bạn.


-2

Bạn cần insertable=falsetrong @Columnchú thích của bạn . JPA sẽ bỏ qua cột đó trong khi chèn vào cơ sở dữ liệu và giá trị mặc định sẽ được sử dụng.

Xem liên kết này: http://mariemjabloun.blogspot.com/2014/03/resolve-set-database-default-value-in.html


2
Sau đó, làm thế nào bạn sẽ chèn giá trị đã cho @r Yoon ??
Ashish Ratan

Đúng là như vậy. nullable=falsesẽ thất bại với SqlException: Caused by: java.sql.SQLException: Column 'opening_times_created' cannot be null. Ở đây tôi quên đặt dấu thời gian "đã tạo" với openingTime.setOpeningCreated(new Date()). Đây là một cách hay để có sự nhất quán nhưng đó là điều người hỏi không hỏi.
Roland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.