मैं हाइबरनेट फ़ील्ड में डिफ़ॉल्ट मान कैसे सेट करूं?
@ColumnDefault
मैं हाइबरनेट फ़ील्ड में डिफ़ॉल्ट मान कैसे सेट करूं?
@ColumnDefault
जवाबों:
यदि आप एक वास्तविक डेटाबेस डिफ़ॉल्ट मान चाहते हैं, तो उपयोग करें columnDefinition:
@Column(name = "myColumn", nullable = false, columnDefinition = "int default 100")
ध्यान दें कि स्ट्रिंग columnDefinitionडेटाबेस पर निर्भर है। यदि आप इस विकल्प को चुनते हैं dynamic-insert, तो Hibernateभी आपको उपयोग करना होगा , इसलिए nullसम्मिलित किए गए मानों वाले कॉलम शामिल नहीं हैं । अन्यथा डिफ़ॉल्ट के बारे में बात करना अप्रासंगिक है।
लेकिन अगर आप डेटाबेस डिफ़ॉल्ट मान नहीं चाहते हैं, लेकिन बस अपने जावा कोड में एक डिफ़ॉल्ट मान, बस इस तरह अपने चर को इनिशियलाइज़ करें - 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" />
...
देखें, कुंजी सम्मिलित है = "झूठी" अपडेट = "झूठी"
एक समाधान यह है कि आपका गेटर चेक यह देखने के लिए कि क्या आप जिस मूल्य के साथ काम कर रहे हैं वह अशक्त है (या जो भी इसकी गैर-आरंभिक स्थिति होगी) और यदि यह उसके बराबर है, तो बस अपना डिफ़ॉल्ट मान लौटाएं:
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}
मैंने इसके लिए खोज की और स्तंभ के लिए डिफ़ॉल्ट मान के कई उत्तर पाए। यदि आप SQL तालिका में परिभाषित डिफ़ॉल्ट मान का उपयोग करना चाहते हैं तो @ एनॉल्यूमेंट एनोटेशन " इन्सर्टेबल = गलत" का उपयोग करें । insertable
@ कॉलम (नाम = स्तंभ नाम, लंबाई = लंबाईऑनलाइन, सम्मिलित करने योग्य = गलत)
यदि आप कॉलमडिफ़िनेशन का उपयोग कर रहे हैं, तो यह हो सकता है @ कॉलम एनोटेशन यह काम नहीं करेगा क्योंकि यह डेटाबेस पर निर्भर है।
ओरेकल के साथ काम करते हुए, मैं एनम के लिए एक डिफ़ॉल्ट मान सम्मिलित करने का प्रयास कर रहा था
मुझे सबसे अच्छा काम करने के लिए निम्नलिखित मिला।
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private EnumType myProperty = EnumType.DEFAULT_VALUE;
आप डिफ़ॉल्ट मान सेट करने के लिए जावा क्लास कंस्ट्रक्टर का उपयोग कर सकते हैं। उदाहरण के लिए:
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 स्कीमा उत्पन्न कर रहे हैं, हालांकि यह अनुशंसित नहीं है, तो आप columnDefinitionJPA @Columnएनोटेशन की विशेषता का उपयोग कर सकते हैं , जैसे:
@Column(
name = "created_on",
columnDefinition = "DATETIME(6) DEFAULT CURRENT_TIMESTAMP"
)
@Generated(GenerationTime.INSERT)
private LocalDateTime createdOn;
@Generatedएनोटेशन आवश्यक है क्योंकि हम हाइबरनेट निर्देश देने के लिए इकाई के बाद हठ प्रसंग प्लावित है, अन्यथा, डेटाबेस-उत्पन्न मूल्य में स्मृति इकाई राज्य के साथ सिंक्रनाइज़ नहीं होंगे फिर से लोड करना चाहते हैं।
उपयोग करने के बजाय columnDefinition, आप फ्लाईवे जैसे उपकरण का उपयोग करने से बेहतर हैं और DDL वृद्धिशील माइग्रेशन स्क्रिप्ट का उपयोग करें। इस तरह, आप DEFAULTJPA एनोटेशन के बजाय स्क्रिप्ट में SQL क्लॉज़ सेट करेंगे ।
@Generatedएनोटेशन का उपयोग करने के बारे में अधिक जानकारी के लिए , इस लेख को देखें ।
<property name="age" type="integer">
<column name="age" not-null="false" default="null" />
</property>
मैं हाइबरनेट 5 के साथ काम कर रहा हूं और पोस्टग्रेज करता हूं, और इसने मुझे काम दिया।
@Column(name = "ACCOUNT_TYPE", ***nullable***=false, columnDefinition="varchar2 default 'END_USER'")
@Enumerated(EnumType.STRING)
private AccountType accountType;
यदि आप डेटाबेस के संदर्भ में डिफ़ॉल्ट मान सेट करना चाहते हैं, तो बस सेट करें @Column( columnDefinition = "int default 1")
लेकिन अगर आपका इरादा अपने जावा ऐप में एक डिफ़ॉल्ट मान सेट करने का है, तो आप इसे इस तरह अपनी कक्षा की विशेषता पर सेट कर सकते हैं: private Integer attribute = 1;
उपरोक्त सुझाव काम करता है, लेकिन केवल अगर एनोटेशन का उपयोग गेटर विधि पर किया जाता है। यदि एनोटेशन का उपयोग किया जाता है जहां सदस्य घोषित किया जाता है, तो कुछ भी नहीं होगा।
public String getStringValue(){
return (this.stringValue == null) ? "Default" : stringValue;
}