8

मैं एक ऐसा एप्लीकेशन लिख रहा हूं जहां सभी स्ट्रिंग गुणों को स्थानीयकृत किया जाना चाहिए, यानी उन्हें प्रत्येक उपलब्ध लोकेल के लिए एक अलग मूल्य स्टोर करना होगा।हाइबरनेट में एक स्थानीय स्ट्रिंग मैपिंग - कोई भी सर्वोत्तम अभ्यास?

public class Product { 
    private Map<Locale, String> description; 
    private Map<Locale, String> note; 

इसलिए मैं एक LocalString उद्देश्य यह है कि विभिन्न स्थानों के लिए अलग तार पकड़ कर सकते हैं लागू किया: एक त्वरित समाधान एक मानचित्र, जो आसानी से हाइबरनेट में मैप किया जा सकता है, लेकिन जावा प्रोग्रामर पर अच्छा नहीं है का उपयोग करने के होगा:

public class LocalString { 
    private Map<Locale, String> localStrings; 

डोमेन वस्तु

public class Product { 
    private LocalString description; 
    private LocalString note; 

मैं सबसे अच्छा हाइबरनेट एनोटेशन के साथ इन वस्तुओं कैसे मैप करते हो जाता है?

मुझे लगता है कि सबसे अच्छा मानचित्रण एक घटक के रूप LocalString का उपयोग किया जा जाएगा:

@Embeddable 
public class LocalString { 
    private Map<Locale, String> localStrings; 

    @ElementCollection 
    public Map<Locale, String> getLocalStrings() { 
     return localStrings; 
    } 

...

@Entity 
public class Product { 
    private Long id; 
    private LocalString description; 
    private LocalString note; 

    @Embedded 
    public LocalString getDescription() { 
      return description; 
    } 

सभी अब तक ठीक है: hbm2ddl चींटी कार्य दो टेबल, एक बनाता है "उत्पाद" तालिका और एक "Products_localStrings" तालिका जिसमें कुंजी और मान कॉलम होते हैं।

@Embedded 
    public LocalString getNote() { 
      return note; 
    } 

दूसरी संपत्ति स्कीमा में दिखाई नहीं देता: जब मैं दूसरी संपत्ति के लिए गेटर जोड़ने सब कुछ टूट जाता है। मैं दो स्तंभों के लिए अलग-अलग नामों को परिभाषित करने के @AttributesOverride टैग का उपयोग करने की कोशिश की, लेकिन उत्पन्न स्कीमा सही नहीं है:

@Embedded 
    @AttributeOverrides({ 
      @AttributeOverride(name="localStrings", [email protected](name="description")) 
    }) 
    public LocalString getDescription() { 
      return description; 
    } 
    @Embedded 
    @AttributeOverrides({ 
      @AttributeOverride(name="localStrings", [email protected](name="note")) 
    }) 
    public LocalString getNote() { 
      return note; 
    } 

उत्पन्न स्कीमा में, कुंजी स्तंभ गायब हो गया है और प्राथमिक कुंजी का उपयोग करता है "विवरण" , जो सही नहीं है:

create table Product_localStrings (Product_id bigint not null, note varchar(255), description varchar(255), primary key (Product_id, description)); 

इसे ठीक करने का कोई तरीका?

क्या मैं स्थानीय स्तर पर एक इकाई के रूप में एम्बेडेड घटकों के बिना बेहतर होगा?

कोई वैकल्पिक डिज़ाइन?

धन्यवाद।

संपादित

मैं एक एक्सएमएल मानचित्रण के साथ की कोशिश की और मैं एक उचित स्कीमा पाने में कामयाब रहे, लेकिन क्योंकि हाइबरनेट सिर्फ एक

<hibernate-mapping> 
    <class name="com.yr.babka37.demo.entity.Libro" table="LIBRO"> 
     <id name="id" type="java.lang.Long"> 
      <column name="ID" /> 
      <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator"/> 
     </id> 
     <property name="titolo" type="java.lang.String"> 
      <column name="TITOLO" /> 
     </property> 
     <component name="descrizioni" class="com.yr.babka37.entity.LocalString"> 
     <map name="localStrings" table="libro_strings" lazy="true" access="field"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <map-key type="java.lang.String"></map-key> 
      <element type="java.lang.String"> 
       <column name="descrizione" /> 
      </element> 
     </map> 
     </component> 
     <component name="giudizi" class="com.yr.babka37.entity.LocalString"> 
     <map name="localStrings" table="libro_strings" lazy="true" access="field"> 
      <key> 
       <column name="ID" /> 
      </key> 
      <map-key type="java.lang.String"></map-key> 
      <element type="java.lang.String"> 
       <column name="giudizio" /> 
      </element> 
     </map> 
     </component> 
    </class> 
</hibernate-mapping> 

के बजाय दो आवेषण उत्पन्न आवेषण एक प्राथमिक कुंजी उल्लंघन के साथ विफल स्कीमा है

create table LIBRO (ID bigint not null auto_increment, TITOLO varchar(255), primary key (ID)); 
create table libro_strings (ID bigint not null, descrizione varchar(255), idx varchar(255) not null, giudizio varchar(255), primary key (ID, idx)); 
alter table libro_strings add index FKF576CAC5BCDBA0A4 (ID), add constraint FKF576CAC5BCDBA0A4 foreign key (ID) references LIBRO (ID); 

प्रवेश करें:

01,235,
DEBUG org.hibernate.SQL - insert into libro_strings (ID, idx, descrizione) values (?, ?, ?) 
DEBUG org.hibernate.SQL - insert into libro_strings (ID, idx, giudizio) values (?, ?, ?) 
WARN o.h.util.JDBCExceptionReporter - SQL Error: 1062, SQLState: 23000 
ERROR o.h.util.JDBCExceptionReporter - Duplicate entry '5-ita_ITA' for key 'PRIMARY' 

मैं निम्न जैसे एक ही सम्मिलन उत्पन्न करने के लिए हाइबरनेट कैसे कहूं?

    :

    insert into libro_strings (ID, idx, descrizione, giudizio) values (?, ?, ?, ?) 
    

    संपादित करें पर 2011.Apr.05

    मैं, जब तक मैं दोनों समस्याओं पर ठोकर खाई थोड़ी देर के लिए मानचित्र समाधान (@ElementCollection साथ एनोटेट) का उपयोग किया गया है

  • वर्तमान मानदंड एपीआई एम्बेडेड संग्रह पर काम नहीं करता है: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3646
  • वर्तमान हाइबरनेट खोज (लुसीन) एपीआई एम्बेडेड संग्रह पर काम नहीं करता है: http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-566

मुझे पता है कि मानदंड के बजाय HQL का उपयोग कर और अपने खुद के FieldBridge Lucene में मानचित्र की देखभाल करने को परिभाषित करने जैसे कई कामकाज से जुड़े हैं,, लेकिन मैं समाधान पसंद नहीं है: वे काम करते हैं जब तक अगले समस्या को हल आता है । प्रत्येक प्रॉपर्टी के लिए,

@MappedSuperclass 
public class LocalString { 
private long id; 
private String localeCode; 
private String value; 

तब मैं परिभाषित:

मैं एक वर्ग "LocalString" उस स्थान और मूल्य (लोकेल वास्तव में ISO3 कोड है) रखती है परिभाषित: इसलिए मैं अब इस दृष्टिकोण अनुसरण कर रहा हूँ

@Entity 
public class ProductName extends LocalString { 
    // Just a placeholder to name the table 
} 

अब मैं इसे अपने उत्पाद वस्तु में उपयोग कर सकते हैं:

public class Product { 
    private Map<String, ProductName> names; 

    @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true) 
    @JoinColumn(name="Product_id") 
    @MapKey(name="localeCode") 
    protected Map<String, ProductName> getNames() { 
    return names; 
    } 
मैं स्थानीय बनाना, LocalString का एक उपवर्ग, जो खाली है चाहता हूँ

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

+0

आगे के प्रयोगों से पता चलता है कि विशेषताऑवर्राइड्स मानचित्र के कुंजी और मूल्य कॉलम को एक ही कॉलम में ढहता है। – xtian

+0

मैंने एक एक्सएमएल मैपिंग के साथ प्रयास किया और मुझे एक वैध स्कीमा प्राप्त करने में कामयाब रहा, लेकिन हाइबरनेट द्वारा उत्पन्न एसक्यूएल प्रत्येक संपत्ति को एक अलग डालने पर स्टोर करता है, जो प्राथमिक कुंजी बाधा उल्लंघन में समाप्त होता है। – xtian

+0

ईमानदारी से, मेरे पास पढ़ने के लिए समय है और मुझे लगता है कि कई प्रश्न शामिल हैं। जब आप किसी भी प्रश्न को समस्या को कम कर सकते हैं तो वर्णन करने में आसान है, तो आपको बहुत बेहतर समर्थन मिलता है। –

उत्तर

1

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

या तो घटक के रूप में यह नक्शा:

<component name="descrizioni"> 
     <map name="localStrings" table="descrizioni_strings" ...> 
     <!-- ... --> 
     </map> 
    </component> 
    <component name="giudizi"> 
     <map name="localStrings" table="giudizi_strings" ... > 
     <!-- ... --> 
     </map> 
    </component> 

या के रूप में स्वतंत्र इकाई:

<many-to-one name="descrizioni" class="LocalString"/> 
    <many-to-one name="giudizi" class="LocalString"/> 

दूसरे मामले में, LocalString एक इकाई है। इसे एक आईडी और इसकी अपनी मैपिंग परिभाषा की आवश्यकता है।

+0

आप सही हैं, मैं दोनों मानचित्रों के लिए एक ही टेबल का उपयोग करने की कोशिश कर रहा था, जो शुरुआत में अच्छा लगा लेकिन अब मुझे एहसास हुआ कि यह गलत है। – xtian

+0

"स्वतंत्र इकाई" समाधान में, मेरे आवेदन के सभी स्थानीय तार उसी लोकलस्ट्रिंग तालिका पर जाते हैं। मैं यह नहीं करना चाहता था, लेकिन अब मुझे एहसास हुआ कि मैंने अपने प्रश्न में ऐसा नहीं कहा था। यह स्पष्ट नहीं करने के लिए मेरी माफ़ी। – xtian

+0

तर्क "एक टेबल बनाम कई टेबल" कुछ और है जो संबोधित करने योग्य हो सकता है। – xtian

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