Cách đặt giá trị thuộc tính thực thể mặc định với Hibernate


145

Làm cách nào để đặt giá trị mặc định trong trường Hibernate?


3
Bạn đang sử dụng tệp cấu hình XML hoặc các chú thích?
Bruno

2
Câu trả lời dưới đây chỉ đưa ra các giải pháp JPA, đó là chính xác nhưng .Đối với một giải pháp Hibernate thấy stackoverflow.com/questions/28107554/... bạn phải sử dụng@ColumnDefault
pdem

Câu trả lời:


185

Nếu bạn muốn một giá trị mặc định cơ sở dữ liệu thực, sử dụng columnDefinition:

@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100") 

Lưu ý rằng chuỗi trong columnDefinitionphụ thuộc vào cơ sở dữ liệu. Ngoài ra, nếu bạn chọn tùy chọn này, bạn phải sử dụng dynamic-insert, do Hibernateđó không bao gồm các cột vớinull giá trị khi chèn. Nếu không nói về mặc định là không liên quan.

Nhưng nếu bạn không muốn giá trị mặc định của cơ sở dữ liệu, mà chỉ đơn giản là giá trị mặc định trong mã Java của bạn, chỉ cần khởi tạo biến của bạn như thế - private Integer myColumn = 100;


6
Với các chú thích: @ org.hibernate.annotations.Entity (DynamicInsert = true)
homaxto

9
Hiện org.hibernate.annotations.Entityđang bị phản đối. @DynamicInsertchú thích nên được sử dụng thay thế.
jannis

1
Tôi không khuyên bạn nên sử dụng cộtDefDef cho tình huống này, đây không phải là di động từ cơ sở dữ liệu này sang cơ sở dữ liệu khác và bạn cần biết ngôn ngữ SQL cụ thể của máy chủ của mình.
pdem

@DocateInsert cần được thêm vào lớp pojo cơ sở dữ liệu.
Reaz Murshed

3
Tôi khuyên bạn nên sử dụng @ColumnDefault thay vì cộtDefDef vì đây là cơ sở dữ liệu độc lập hơn docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/ trộm
jalsh

35

Bạn có thể sử dụng @PrePersistanotation và đặt giá trị mặc định trong giai đoạn trước.

Một cái gì đó như thế:

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

Phương pháp này không phụ thuộc vào loại / phiên bản cơ sở dữ liệu bên dưới Hibernate. Giá trị mặc định được đặt trước khi duy trì đối tượng ánh xạ.


Cho rằng setMyPropertykhông được sử dụng bởi ví dụ của bạn. Tại sao bạn bao gồm nó?
EndermanAPM

Tôi chỉ đưa ra ví dụ về các chú thích ngủ đông cho thuộc tính java tiêu chuẩn (biến riêng với các phương thức get / set công khai). Tôi nhận thấy và sửa một lỗi ... Kiểu chuỗi của phương thức set argumet bị thiếu.
dbricman

30

Điều gì về việc chỉ thiết lập một giá trị mặc định cho trường?

private String _foo = "default";

//property here
public String Foo

nếu chúng vượt qua một giá trị, thì nó sẽ bị ghi đè, nếu không, bạn có một mặc định.


8
@michali: vai trò của một giá trị mặc định không ngăn cản cập nhật giá trị, phải không?
Janusz Lenar

27

sử dụng chú thích ngủ đông

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

Cảm ơn bạn, nó hoạt động. Nhưng tôi đã phải tạo lại bảng.
Yamashiro Rion

1
Đây phải là giải pháp thực sự, sử dụng cộtDefDef như đề xuất của câu trả lời hiện tại là một sự vội vàng và bạn phải bao gồm loại. Theo tôi, chú thích @ColumnDefault dễ dàng hơn nhiều.
Judos

7

Nếu bạn muốn làm điều đó trong cơ sở dữ liệu:

Đặt giá trị mặc định trong cơ sở dữ liệu (mẫu máy chủ sql):

ALTER TABLE [TABLE_NAME] ADD  CONSTRAINT [CONSTRAINT_NAME]  DEFAULT (newid()) FOR [COLUMN_NAME]

Ánh xạ tập tin ngủ đông:

    <hibernate-mapping ....
    ...    
    <property name="fieldName" column="columnName" type="Guid" access="field" not-null="false"  insert="false" update="false"  />
    ...

Xem, khóa là insert = "false" update = "false"


Có một vấn đề đối với Oracle: Nếu thuộc tính không phải là null, giá trị của nó VẪN giá trị mặc định. Không phải giá trị thực tế.
trẻ

5

Một giải pháp là kiểm tra getter của bạn để xem liệu bạn đang làm việc với giá trị nào là null (hoặc bất kỳ trạng thái không khởi tạo nào của nó) và nếu nó bằng giá trị đó, chỉ cần trả về giá trị mặc định của bạn:

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}

Tôi đang sử dụng một trình ánh xạ gọi setter trên đối tượng thực thể của tôi. Có một nhược điểm nào khi sử dụng đoạn mã của bạn trên cả getter và setter không?
Eric Francis

4

Tôi đã tìm kiếm điều này và tìm thấy nhiều câu trả lời cho giá trị mặc định cho cột. Nếu bạn muốn sử dụng giá trị mặc định được xác định trong Bảng SQL thì trong Chú thích @Column sử dụng "insertable = false" . có thể chèn

@Column (name = cộtName, length = lengthOfColumn, insertable = false)

Nếu bạn đang sử dụng cột Xác định thì chú thích @Column có thể không hoạt động vì nó phụ thuộc vào Cơ sở dữ liệu.


Điều này hoạt động rất tốt cho các cột như "createdAt" nơi bạn luôn muốn sử dụng mặc định DB. Cảm ơn!
Michal Filip

4

Sử dụng @ColumnDefault()chú thích. Đây chỉ là ngủ đông.


2

Làm việc với Oracle, tôi đã cố gắng chèn một giá trị mặc định cho Enum

Tôi tìm thấy sau đây để làm việc tốt nhất.

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;

2

Bạn có thể sử dụng hàm tạo của lớp java để đặt các giá trị mặc định. Ví dụ:

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

Để sử dụng giá trị mặc định từ bất kỳ cột nào của bảng. sau đó bạn phải xác định @DynamicInsertlà đúng hoặc nếu không bạn chỉ cần xác định @DynamicInsert. Bởi vì ngủ đông mặc định là đúng. Hãy xem xét như ví dụ đã cho:

@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {

    @Column(name = "status", columnDefinition = "int default 100")
    private Long status;

}

2

Giá trị thuộc tính thực thể mặc định

Nếu bạn muốn đặt giá trị thuộc tính thực thể mặc định, thì bạn có thể khởi tạo trường thực thể bằng giá trị mặc định.

Chẳng hạn, bạn có thể đặt createdOnthuộc tính thực thể mặc định theo thời gian hiện tại, như sau:

@Column(
    name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();

Giá trị cột mặc định

Nếu bạn đang tạo lược đồ DDL bằng Hibernate, mặc dù điều này không được khuyến nghị, bạn có thể sử dụng columnDefinitionthuộc tính của @Columnchú thích JPA , như sau:

@Column(
    name = "created_on", 
    columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;

Các @Generated chú thích là cần thiết bởi vì chúng tôi muốn hướng dẫn Hibernate để tải lại đơn vị sau khi bối cảnh Persistence là đỏ ửng, nếu không, giá trị cơ sở dữ liệu được tạo ra sẽ không được đồng bộ hóa với nhà nước tổ chức trong bộ nhớ.

Thay vì sử dụng columnDefinition, bạn nên sử dụng một công cụ như Flyway và sử dụng các tập lệnh di chuyển gia tăng DDL. Bằng cách đó, bạn sẽ đặt DEFAULTmệnh đề SQL trong một tập lệnh, thay vì trong chú thích JPA.

Để biết thêm chi tiết về việc sử dụng @Generatedchú thích, hãy xem bài viết này .



1

Tôi đang làm việc với hibernate 5 và postgres, và điều này làm việc với tôi.

@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;

0

Nếu bạn muốn đặt giá trị mặc định về mặt cơ sở dữ liệu, chỉ cần đặt @Column( columnDefinition = "int default 1")

Nhưng nếu những gì bạn định là đặt một giá trị mặc định trong ứng dụng java của bạn, bạn có thể đặt nó trên thuộc tính lớp của bạn như thế này: private Integer attribute = 1;


-3

Gợi ý trên hoạt động, nhưng chỉ khi chú thích được sử dụng trên phương thức getter. Nếu các chú thích được sử dụng khi thành viên được khai báo, sẽ không có gì xảy ra.

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
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.