मैं एक ऐसा एप्लीकेशन लिख रहा हूं जहां सभी स्ट्रिंग गुणों को स्थानीयकृत किया जाना चाहिए, यानी उन्हें प्रत्येक उपलब्ध लोकेल के लिए एक अलग मूल्य स्टोर करना होगा।हाइबरनेट में एक स्थानीय स्ट्रिंग मैपिंग - कोई भी सर्वोत्तम अभ्यास?
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 साथ एनोटेट) का उपयोग किया गया है
मुझे पता है कि मानदंड के बजाय 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 का एक उपवर्ग, जो खाली है चाहता हूँ
इस दृष्टिकोण के साथ मुझे उस संपत्ति के लिए एक अद्वितीय तालिका बनाने के लिए आवश्यक प्रत्येक संपत्ति के लिए एक खाली कक्षा लिखनी है, जिसे मुझे स्थानीयकृत करने की आवश्यकता है। लाभ यह है कि मैं बिना किसी प्रतिबंध के मानदंड और खोज का उपयोग कर सकता हूं।
आगे के प्रयोगों से पता चलता है कि विशेषताऑवर्राइड्स मानचित्र के कुंजी और मूल्य कॉलम को एक ही कॉलम में ढहता है। – xtian
मैंने एक एक्सएमएल मैपिंग के साथ प्रयास किया और मुझे एक वैध स्कीमा प्राप्त करने में कामयाब रहा, लेकिन हाइबरनेट द्वारा उत्पन्न एसक्यूएल प्रत्येक संपत्ति को एक अलग डालने पर स्टोर करता है, जो प्राथमिक कुंजी बाधा उल्लंघन में समाप्त होता है। – xtian
ईमानदारी से, मेरे पास पढ़ने के लिए समय है और मुझे लगता है कि कई प्रश्न शामिल हैं। जब आप किसी भी प्रश्न को समस्या को कम कर सकते हैं तो वर्णन करने में आसान है, तो आपको बहुत बेहतर समर्थन मिलता है। –