ฉันจะตั้งค่าเริ่มต้นในฟิลด์ Hibernate ได้อย่างไร
@ColumnDefault
ฉันจะตั้งค่าเริ่มต้นในฟิลด์ Hibernate ได้อย่างไร
@ColumnDefault
คำตอบ:
หากคุณต้องการค่าเริ่มต้นของฐานข้อมูลจริงให้ใช้columnDefinition
:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
ขอให้สังเกตว่าสตริงในcolumnDefinition
นั้นขึ้นอยู่กับฐานข้อมูล นอกจากนี้หากคุณเลือกตัวเลือกนี้คุณต้องใช้dynamic-insert
ดังนั้นจึงHibernate
ไม่รวมคอลัมน์ด้วยnull
ค่าในการแทรก มิฉะนั้นการพูดถึงค่าเริ่มต้นนั้นไม่เกี่ยวข้อง
แต่ถ้าคุณไม่ต้องการค่าเริ่มต้นของฐานข้อมูล แต่เป็นเพียงค่าเริ่มต้นในรหัส Java ของคุณเพียงแค่เริ่มต้นตัวแปรของคุณเช่นนั้น - private Integer myColumn = 100;
org.hibernate.annotations.Entity
เลิกใช้แล้ว @DynamicInsert
ควรใช้คำอธิบายประกอบแทน
คุณสามารถใช้คำ@PrePersist
อธิบายประกอบและตั้งค่าเริ่มต้นในขั้นตอนก่อนล่วงหน้า
อะไรแบบนั้น:
//... 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;
}
วิธีนี้ไม่ได้ขึ้นอยู่กับประเภท / รุ่นของฐานข้อมูลภายใต้การไฮเบอร์เนต ค่าเริ่มต้นถูกตั้งค่าก่อนที่จะคงอยู่วัตถุการทำแผนที่
setMyProperty
ว่าไม่ได้ใช้โดยตัวอย่างของคุณ ทำไมคุณรวมถึง?
สิ่งที่เกี่ยวกับเพียงแค่การตั้งค่าเริ่มต้นสำหรับสนาม?
private String _foo = "default";
//property here
public String Foo
หากพวกเขาผ่านค่าจากนั้นมันจะถูกเขียนทับมิฉะนั้นคุณมีค่าเริ่มต้น
ใช้คำอธิบายประกอบจำศีล
@ColumnDefault("-1")
private Long clientId;
ถ้าคุณต้องการที่จะทำในฐานข้อมูล:
ตั้งค่าเริ่มต้นในฐานข้อมูล (ตัวอย่างเซิร์ฟเวอร์ sql):
ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] DEFAULT (newid()) FOR [COLUMN_NAME]
การทำแผนที่ไฟล์จำศีล:
<hibernate-mapping ....
...
<property name="fieldName" column="columnName" type="Guid" access="field" not-null="false" insert="false" update="false" />
...
ดูว่ากุญแจคือ insert = "false" update = "false"
ทางออกหนึ่งคือการตรวจสอบทะเยอทะยานของคุณเพื่อดูว่าสิ่งที่คุณกำลังทำงานกับค่าใดเป็นโมฆะ (หรือสถานะที่ไม่ได้กำหนดค่าเริ่มต้น) และถ้ามันเท่ากับนั้นเพียงแค่คืนค่าเริ่มต้นของคุณ:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
ผมค้นหานี้และพบว่าหลายคำตอบค่าเริ่มต้นสำหรับ column.If คุณต้องการที่จะใช้ค่าเริ่มต้นที่กำหนดไว้ในตาราง SQL แล้วใน @column หมายเหตุการใช้"insertable = false" insertable
@Column (ชื่อ = columnName, length = lengthOfColumn, insertable = false)
หากคุณกำลังใช้ columnDefination มัน @ หมายเหตุประกอบคอลัมน์อาจไม่ทำงานเนื่องจากขึ้นอยู่กับฐานข้อมูล
ใช้@ColumnDefault()
คำอธิบายประกอบ นี่คือการไฮเบอร์เนตเท่านั้น
ทำงานกับ Oracle ฉันพยายามแทรกค่าเริ่มต้นสำหรับ Enum
ฉันพบสิ่งต่อไปนี้เพื่อให้ทำงานได้ดีที่สุด
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
คุณสามารถใช้ตัวสร้างคลาส Java เพื่อตั้งค่าเริ่มต้น ตัวอย่างเช่น:
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
...
}
หากต้องการใช้ค่าเริ่มต้นจากคอลัมน์ใด ๆ ของตาราง แล้วคุณจะต้องจำเป็นต้องกำหนด@DynamicInsert
เป็นความจริงหรืออื่น ๆ @DynamicInsert
คุณเพียงแค่กำหนด เพราะไฮเบอร์เนตใช้ค่าเริ่มต้นเป็นจริง พิจารณาเป็นตัวอย่างที่ได้รับ:
@AllArgsConstructor
@Table(name = "core_contact")
@DynamicInsert
public class Contact implements Serializable {
@Column(name = "status", columnDefinition = "int default 100")
private Long status;
}
หากคุณต้องการตั้งค่าคุณสมบัติเอนทิตีเริ่มต้นจากนั้นคุณสามารถเริ่มต้นฟิลด์เอนทิตีโดยใช้ค่าเริ่มต้น
ตัวอย่างเช่นคุณสามารถตั้งค่าcreatedOn
แอตทริบิวต์เอนทิตีเริ่มต้นเป็นเวลาปัจจุบันเช่นนี้:
@Column(
name = "created_on"
)
private LocalDateTime createdOn = LocalDateTime.now();
หากคุณกำลังสร้างสกีมา DDL ด้วย Hibernate แม้ว่าจะไม่แนะนำก็ตามคุณสามารถใช้แอcolumnDefinition
ททริบิวต์ของ@Column
คำอธิบายประกอบJPA ได้เช่นนี้
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Generated
คำอธิบายประกอบเป็นสิ่งจำเป็นเพราะเราต้องการที่จะสั่ง Hibernate เพื่อโหลดกิจการหลังจากที่บริบทคงทนแดงมิฉะนั้นค่าฐานข้อมูลที่สร้างขึ้นจะไม่ตรงกับที่อยู่ในหน่วยความจำสถานะนิติบุคคล
แทนที่จะใช้columnDefinition
คุณจะดีกว่าการใช้เครื่องมือเช่น Flyway และใช้สคริปต์การย้ายข้อมูลส่วนเพิ่ม DDL ด้วยวิธีนี้คุณจะตั้งค่าส่วนDEFAULT
คำสั่ง SQL ในสคริปต์แทนที่จะเป็นคำอธิบายประกอบ JPA
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการใช้
@Generated
คำอธิบายประกอบให้ตรวจสอบบทความนี้
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
ฉันกำลังทำงานกับ Hibernate 5 และ Postgres และสิ่งนี้ได้ผลกับฉัน
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
หากคุณต้องการตั้งค่าเริ่มต้นในแง่ของฐานข้อมูลเพียงแค่ตั้งค่า @Column( columnDefinition = "int default 1")
แต่ถ้าสิ่งที่คุณตั้งใจจะตั้งค่าเริ่มต้นในแอป java ของคุณคุณสามารถตั้งค่าในแอตทริบิวต์ class ของคุณเช่นนี้: private Integer attribute = 1;
ข้อเสนอแนะดังกล่าวใช้งานได้ แต่เฉพาะในกรณีที่ใช้คำอธิบายประกอบในวิธี getter หากมีการใช้คำอธิบายประกอบที่สมาชิกประกาศจะไม่มีอะไรเกิดขึ้น
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}