Làm cách nào để đặt giá trị mặc định trong trường Hibernate?
@ColumnDefault
Làm cách nào để đặt giá trị mặc định trong trường Hibernate?
@ColumnDefault
Câu trả lời:
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 columnDefinition
phụ 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;
org.hibernate.annotations.Entity
đang bị phản đối. @DynamicInsert
chú thích nên được sử dụng thay thế.
Bạn có thể sử dụng @PrePersist
anotation 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ạ.
setMyProperty
không được sử dụng bởi ví dụ của bạn. Tại sao bạn bao gồm nó?
Đ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.
sử dụng chú thích ngủ đông
@ColumnDefault("-1")
private Long clientId;
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"
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 đã 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.
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;
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
...
}
Để 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 @DynamicInsert
là đú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;
}
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 createdOn
thuộ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();
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 columnDefinition
thuộc tính của @Column
chú 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 DEFAULT
mệ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
@Generated
chú thích, hãy xem bài viết này .
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
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;
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;
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;
}