2011-01-30 11 views
11

मैं निम्नलिखित "रूट" इकाई (हाइबरनेट-विशिष्ट भागों पर टिप्पणी की) हैअलग जेपीए संस्थाओं में तोड़ मरोड़

@Entity 
//@GenericGenerator(name="system-uuid",strategy="org.hibernate.id.UUIDGenerator") 
public class Node extends PersistentEntity { 
    private UUID id; 
    private String name; 
    private String displayName; 

    @Id 
    @GeneratedValue 
    //@GeneratedValue(generator="system-uuid") //instead of above line 
    //@Type(type = "pg-uuid") 
    public UUID getId() { return id; } 

    public String getName() { return name; } 

    public String getDisplayName() { return displayName; } 

    //stuff omitted 
} 

यह एक हठ संदर्भ 6 के रूप में JBoss पर तैनात का हिस्सा है (हाइबरनेट 3.6) डेटाबेस के लिए PostgreSQL 9 का उपयोग कर (नवीनतम जेडीबीसी 4 ड्राइवर का उपयोग कर)। (उपरोक्त कोड में बाहर टिप्पणी की) PostgreSQL अपनी ही UUID स्तंभ प्रकार है, जो कुछ हाइबरनेट विशिष्ट मैपिंग की आवश्यकता है ठीक से उपयोग करने की है - अन्यथा बाइनरी UUID क्षेत्र मैप करने के लिए कोशिश करेंगे हाइबरनेट, तो PostgreSQL बोली का समर्थन नहीं करता द्विआधारी (जाहिरा तौर पर क्योंकि पोस्टग्रे में द्विआधारी और हाइबरनेट देवों को संग्रहीत करने के 2 तरीके हैं) और पूरी चीज विस्फोट हो जाती है।

ऊपर लाइनों uncommenting कोड काम कर रहा है, लेकिन यह मेरे लिए मजबूर करता हाइबरनेट पर एक संकलन समय निर्भरता के लिए - जो मैं नहीं बल्कि बचने चाहते हैं।

मिश्रण में एक hbm.xml फ़ाइल जोड़ने का प्रयास और persistence.xml फ़ाइल और व्याख्याओं से डेटा मर्ज नहीं होता से संदर्भित है, लेकिन बस एनोटेशन पर ध्यान नहीं देता:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="package"> 
    <class name="Node"> 
     <id name="id" type="pg-uuid"> 
      <generator class="org.hibernate.id.UUIDGenerator"/> 
     </id> 
    </class> 
</hibernate-mapping> 

मैं कर सकता हूँ "फुलाना "इस अतिरिक्त 2 गुण जोड़कर अप फ़ाइल, लेकिन फिर भी अगर मैं कि (जिस पर नोड वर्ग काम करता है इंगित) करते हैं, की तरह, किसी भी अतिरिक्त संस्थाओं को जोड़ने:

@Entity 
public class Host extends Node { 
    //fields, getters, fluff 
}

मैं निम्न अपवाद प्राप्त करें:

org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Node

हाइबरनेट के बाद से "पाता है" नोड दो बार। क्या इस के आसपास कोई सुरुचिपूर्ण तरीका है? आदर्श रूप से, नोड एकमात्र वर्ग है जिसके लिए मुझे हाइबरनेट-विशिष्ट गुणों की आवश्यकता होगी, और यह कक्षाओं के बड़े पदानुक्रम की जड़ होगी। मैं एचबीएम.एक्सएमएल में पूरी तरह से हाइबरनेट या मैपिंग पर संकलन-समय निर्भरताओं से बचना चाहता हूं। पूर्णता 'खातिर, यहाँ persistence.xml फ़ाइल का उपयोग कर im है:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 
    <persistence-unit name="myPU" transaction-type="JTA"> 
     <jta-data-source>java:/my-postgresql-DS</jta-data-source> 
     <mapping-file>META-INF/hbm.xml</mapping-file> 
     <!-- shouldnt need to list classes here since this is deployed --> 
     <!-- in the same jar as the classes and scanning should work --> 
     <validation-mode>AUTO</validation-mode> 
     <properties> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

मैं "जेपीए के साथ जावा हठ" (एक जेपीए 2.0 -book) की जाँच की है, लेकिन यह UUIDs के बारे में कुछ नहीं कहा, तो मुझे लगता है कि वे अभी तक जेपीए द्वारा समर्थित नहीं हैं। – esaj

+0

उन्होंने कम से कम इस अर्थ में समर्थित किया है कि धारावाहिक योग्य कुछ भी समर्थित है (बाइनरी डेटा में अनुवाद करेगा)। लेकिन PostgreSQL + हाइबरनेट के साथ आपको यह भी प्राप्त नहीं होगा ... – radai

उत्तर

0

जवाब यह है कि यह नहीं किया जा सकता (कम से कम जेपीए 2.0 में)

0

आप नोड स्तरीय बंद @ इकाई-एनोटेशन छोड़ने की कोशिश कर सकते हैं, और hbm.xml में पूरी तरह से यह नक्शा, या लिस्टिंग सभी persistence.xml में नोड को छोड़कर और < का उपयोग करके-असूचीबद्ध-वर्ग /> को छोड़कर, फिर इसे hbm.xml में मैपिंग करें। कोई विचार नहीं है कि इनमें से कोई भी दृष्टिकोण वास्तव में काम करता है, तो उत्तरार्द्ध वास्तव में वर्ग को मैप करने से hbm.xml को भी रोक सकता है।

+0

नोड से @ एंटीटी छोड़ने के परिणामस्वरूप "कोई भी पहचानकर्ता जो [जो भी विस्तार करता है]" के लिए निर्दिष्ट नहीं है। मैपिंग (भाग को छोड़कर) को "संकीर्ण" करने की कोशिश करते समय नोड पर @Entity को रखते हुए अभी भी टकराव में परिणाम होता है (क्योंकि यह विरासत के पेड़ पर चढ़ता है और अभी भी इसे पाता है, मुझे लगता है) – radai

1

मैं सुझाव है कि आसान बनाने में कर सकते हैं या समस्या को हल मार्ग, हालांकि मैं hbm.xml के बारे में अपने विशिष्ट सवाल का जवाब नहीं कर रहा हूँ की एक जोड़ी है।

1) आप मैन्युअल रूप से अपने आईडी जेनरेट कर सकते हैं। @GeneratedValue को छोड़ दें और मेरा मानना ​​है कि आप केवल आरएफसी 4122 अनुपालन यूयूआईडी उत्पन्न करने के लिए जावा के UUID.randomUUID() का उपयोग कर सकते हैं जैसे कि हाइबरनेट के 'uuid2' जनरेटर। मैंने हाइबरनेट में उस विशिष्ट जेनरेटर का उपयोग नहीं किया है, लेकिन यदि आप चाहते हैं कि एक वैध यूयूआईडी है, तो ऐसा लगता है कि इसे मैन्युअल रूप से उत्पन्न करने से आपको कुछ कॉन्फ़िगरेशन नृत्य से बचने में मदद मिल सकती है।

2) निजी तौर पर मैं सिर्फ varchar स्तंभों में PostgreSQL में UUIDs (गैर आईडी कॉलम के लिए यद्यपि) की दुकान। मुझे लगता है कि डेटाबेस स्लीथिंग के लिए समय आने पर, मैं यूयूआईडी को लॉग फाइलों से काट रहा हूं और पेस्ट कर रहा हूं, और इससे पूछताछ करना आसान हो जाता है। जब यूयूआईडी को बिनरी के रूप में संग्रहीत किया गया था, तो यह असंभव था, यही कारण है कि हमने उन्हें वक्रार में बदल दिया। हमने यूयूआईडी कॉलम माना लेकिन वर्कर कई चीजों को सरल बनाता है और अंतःक्रियाशीलता में सुधार करता है। अपने जावा क्लास में स्ट्रिंग-टू-यूयूआईडी रूपांतरण को समाहित करना मुश्किल है।

बेशक आपको विरासत कारणों के लिए यूयूआईडी कॉलम प्रकार का उपयोग करना पड़ सकता है, या आप इसे प्रदर्शन कारणों से पसंद कर सकते हैं।कम से कम एक व्यक्ति ने performance comparison of the two approaches किया है।

संबंधित मुद्दे