मेरे पास डेटा दृढ़ता के लिए हाइबरनेट का उपयोग करके एक अनुप्रयोग है, जिसमें वसंत शीर्ष पर है (अच्छे उपाय के लिए)।हाइबरनेट डेटाबेस के माइग्रेशन के लिए DiscriminatorFormula का उपयोग करना बुरा व्यवहार है?
@Entity
public class A {
@Id
@Column(unique = true, nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
public String name;
}
मैं के बाद से एक के एक उपवर्ग, कहा जाता बी जोड़ लिया है:
@Entity
public class B extends A {
public String description;
}
बी जोड़ने के बाद, मैं अब एक के लोड नहीं कर सका अभी हाल तक, वहाँ एक आवेदन में एक लगातार वर्ग था, । निम्नलिखित अपवाद उत्पन्न हुआ था:
class org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException :: Object with id: 1 was not of the specified subclass: A (Discriminator: null); nested exception is org.hibernate.WrongClassException: Object with id: 1 was not of the specified subclass: A (Discriminator: null)
मैं बी के लिए निम्न एनोटेशन और संपत्ति जोड़ा, और यह समस्या हल हो गया लगता है। क्या इस मुद्दे को हल करने का यह सही तरीका है?
...
@DiscriminatorFormula("(CASE WHEN dtype IS NULL THEN 'A' ELSE dtype END)")
public class A {
private String dtype = this.getClass().getSimpleName();
...
विस्तृत उत्तर के लिए धन्यवाद। दुर्भाग्य से मुझे एप्लिकेशन के सभी इंस्टॉलेशन तक सीधे पहुंच नहीं होगी, इसलिए मैं इस स्कीमा को उपयोगकर्ताओं के लिए पारदर्शी रूप से बदलना चाहता हूं। मैंने डिस्प्ले क्षेत्र को स्पष्ट रूप से परिभाषित किए बिना डिस्कमिनेटरफॉर्मूला जोड़ने की कोशिश की, लेकिन यह काम नहीं किया। जब मैं ऐसा कर रहा था तो यह एक हैक की तरह महसूस किया - यही कारण है कि मैंने पूछा। – Armand
@ एलिसन आपका स्वागत है। मैंने आपको "आदर्श" समाधान आईएमओ दिया है। यदि यह आपके संदर्भ में उपयुक्त नहीं है, यदि आप अपने उपयोगकर्ताओं को माइग्रेशन स्क्रिप्ट प्रदान नहीं कर सकते हैं (जो विभिन्न 'ALTER' के बाद' अद्यतन 'निष्पादित करेगा) - या स्वचालित स्वचालित माइग्रेशन टूल भी बेहतर होगा - तो आपका समाधान स्वीकार्य है। कम से कम यह काम करता है। और अब आप जानते हैं कि यह एक हैक है :) –
-) मुझे दुर्भाग्यवश, हाइबरनेट/वसंत में माइग्रेशन पर जानकारी मिली है। – Armand