हाइबरनेट के साथ डिफ़ॉल्ट इकाई गुण मान कैसे सेट करें


145

मैं हाइबरनेट फ़ील्ड में डिफ़ॉल्ट मान कैसे सेट करूं?


3
क्या आप XML config फाइल या एनोटेशन का उपयोग कर रहे हैं?
ब्रूनो

2
नीचे दिए गए उत्तर केवल JPA समाधान देते हैं, जो सही है। लेकिन एक हाइबरनेट समाधान के लिए stackoverflow.com/questions/28107554/ देखें। आपको उपयोग करना होगा@ColumnDefault
pdem

जवाबों:


185

यदि आप एक वास्तविक डेटाबेस डिफ़ॉल्ट मान चाहते हैं, तो उपयोग करें columnDefinition:

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

ध्यान दें कि स्ट्रिंग columnDefinitionडेटाबेस पर निर्भर है। यदि आप इस विकल्प को चुनते हैं dynamic-insert, तो Hibernateभी आपको उपयोग करना होगा , इसलिए nullसम्मिलित किए गए मानों वाले कॉलम शामिल नहीं हैं । अन्यथा डिफ़ॉल्ट के बारे में बात करना अप्रासंगिक है।

लेकिन अगर आप डेटाबेस डिफ़ॉल्ट मान नहीं चाहते हैं, लेकिन बस अपने जावा कोड में एक डिफ़ॉल्ट मान, बस इस तरह अपने चर को इनिशियलाइज़ करें - private Integer myColumn = 100;


6
एनोटेशन के साथ: @ org.hibernate.annotations.Entity (डायनामिक इन्टर = सच)
Homaxto

9
वर्तमान org.hibernate.annotations.Entityमें पदावनत है। @DynamicInsertइसके बजाय एनोटेशन का उपयोग किया जाना चाहिए।
19

1
मैं इस स्थिति के लिए columnDefinition का उपयोग करने की अनुशंसा नहीं करूंगा, यह किसी डेटाबेस से दूसरे में पोर्टेबल नहीं है, और आपको अपने सर्वर की विशिष्ट SQL भाषा को जानने की आवश्यकता है।
pdem

@DynamicInsert को डेटाबेस पूजो क्लास में जोड़ना होगा।
रेयाज मुरशेड

3
मैं कॉलमडिफ़िनिशन के बजाय @ कॉलेडिमेंटफॉल्ट का उपयोग करने की सलाह दूंगा क्योंकि यह अधिक डेटाबेस स्वतंत्र डॉक्स है। jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/…
junh

35

आप @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आपके उदाहरण द्वारा उपयोग नहीं किया गया है। आप इसे क्यों शामिल करते हैं?
एंडरमैनएपीएम

मैं सिर्फ मानक जावा संपत्ति के लिए हाइबरनेट एनोटेशन का उदाहरण देता हूं (सार्वजनिक रूप से निर्धारित / निर्धारित विधियों के साथ निजी चर)। मैंने देखा और एक गलती को ठीक किया ... स्ट्रिंग प्रकार की सेट विधि argumet गायब थी।
dbricman

30

क्षेत्र के लिए केवल एक डिफ़ॉल्ट मान सेट करने के बारे में क्या?

private String _foo = "default";

//property here
public String Foo

यदि वे एक मूल्य पारित करते हैं, तो यह ओवरराइट किया जाएगा, अन्यथा, आपके पास एक डिफ़ॉल्ट है।


8
@ मिचाली: एक डिफ़ॉल्ट मान की भूमिका मूल्य को अद्यतन करने से नहीं रोक रही है, क्या यह है?
Janusz Lenar

27

हाइबरनेट एनोटेशन का उपयोग करें

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

धन्यवाद, यह काम करता है। लेकिन मुझे टेबल को फिर से बनाना पड़ा।
यामाशिरो रियान

1
यह वास्तविक समाधान होना चाहिए, वर्तमान उत्तर द्वारा प्रस्तावित कॉलमफाइनमेंट का उपयोग करना एक जल्दबाजी है और आपको प्रकार को शामिल करना होगा। मेरी राय में एनोटेशन @ कॉलेम्यूडफॉल्ट बहुत आसान है।
judos

7

यदि आप इसे डेटाबेस में करना चाहते हैं:

डेटाबेस में डिफ़ॉल्ट मान सेट करें (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"  />
    ...

देखें, कुंजी सम्मिलित है = "झूठी" अपडेट = "झूठी"


ओरेकल के लिए एक समस्या है: यदि संपत्ति शून्य नहीं है, तो इसका मान डिफ़ॉल्ट मान को रोकें। वास्तविक मूल्य नहीं।
युवा

5

एक समाधान यह है कि आपका गेटर चेक यह देखने के लिए कि क्या आप जिस मूल्य के साथ काम कर रहे हैं वह अशक्त है (या जो भी इसकी गैर-आरंभिक स्थिति होगी) और यदि यह उसके बराबर है, तो बस अपना डिफ़ॉल्ट मान लौटाएं:

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

मैं एक मैपर का उपयोग कर रहा हूं जो मेरी इकाई वस्तु पर सेटर को कॉल करता है। क्या गटर और सेटर दोनों पर अपने कोड स्निपेट का उपयोग करने के लिए नकारात्मक पक्ष है?
एरिक फ्रांसिस

4

मैंने इसके लिए खोज की और स्तंभ के लिए डिफ़ॉल्ट मान के कई उत्तर पाए। यदि आप SQL तालिका में परिभाषित डिफ़ॉल्ट मान का उपयोग करना चाहते हैं तो @ एनॉल्यूमेंट एनोटेशन " इन्सर्टेबल = गलत" का उपयोग करें । insertable

@ कॉलम (नाम = स्तंभ नाम, लंबाई = लंबाईऑनलाइन, सम्मिलित करने योग्य = गलत)

यदि आप कॉलमडिफ़िनेशन का उपयोग कर रहे हैं, तो यह हो सकता है @ कॉलम एनोटेशन यह काम नहीं करेगा क्योंकि यह डेटाबेस पर निर्भर है।


यह "createAt" जैसे स्तंभों के लिए बढ़िया काम करता है जहाँ आप हमेशा DB डिफ़ॉल्ट का उपयोग करना चाहते हैं। धन्यवाद!
मिशैल फिलिप

4

@ColumnDefault()एनोटेशन का उपयोग करें । यह केवल हालांकि हाइबरनेट है।


2

ओरेकल के साथ काम करते हुए, मैं एनम के लिए एक डिफ़ॉल्ट मान सम्मिलित करने का प्रयास कर रहा था

मुझे सबसे अच्छा काम करने के लिए निम्नलिखित मिला।

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

2

आप डिफ़ॉल्ट मान सेट करने के लिए जावा क्लास कंस्ट्रक्टर का उपयोग कर सकते हैं। उदाहरण के लिए:

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

तालिका के किसी भी कॉलम से डिफ़ॉल्ट मान का उपयोग करने के लिए। फिर आपको @DynamicInsertसही के रूप में परिभाषित करने की आवश्यकता है या फिर आप केवल परिभाषित करें @DynamicInsert। क्योंकि हाइबरनेट डिफ़ॉल्ट रूप से एक सच्चे के रूप में होता है। दिए गए उदाहरण के रूप में विचार करें:

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

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

}

2

डिफ़ॉल्ट इकाई गुण मान

यदि आप एक डिफ़ॉल्ट इकाई गुण मान सेट करना चाहते हैं, तो आप डिफ़ॉल्ट मान का उपयोग करके इकाई फ़ील्ड को प्रारंभ कर सकते हैं।

उदाहरण के लिए, आप 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एनोटेशन का उपयोग करने के बारे में अधिक जानकारी के लिए , इस लेख को देखें



1

मैं हाइबरनेट 5 के साथ काम कर रहा हूं और पोस्टग्रेज करता हूं, और इसने मुझे काम दिया।

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

0

यदि आप डेटाबेस के संदर्भ में डिफ़ॉल्ट मान सेट करना चाहते हैं, तो बस सेट करें @Column( columnDefinition = "int default 1")

लेकिन अगर आपका इरादा अपने जावा ऐप में एक डिफ़ॉल्ट मान सेट करने का है, तो आप इसे इस तरह अपनी कक्षा की विशेषता पर सेट कर सकते हैं: private Integer attribute = 1;


-3

उपरोक्त सुझाव काम करता है, लेकिन केवल अगर एनोटेशन का उपयोग गेटर विधि पर किया जाता है। यदि एनोटेशन का उपयोग किया जाता है जहां सदस्य घोषित किया जाता है, तो कुछ भी नहीं होगा।

public String getStringValue(){
     return (this.stringValue == null) ? "Default" : stringValue;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.