2011-03-11 9 views
10

मैं अपने जेपीए 2.0 कार्यान्वयन के रूप में हाइबरनेट 3.5.6 का उपयोग कर रहा हूँ। मैं एक @ElementCollection मेरी इकाई के अंदर बनाने का प्रयास कर रहा हूँ (कई क्षेत्रों छोड़े गए):एंबेडेबल प्रकार के एलिमेंट कोलेक्शन का निर्माण कैसे करें?

@Entity 
public class Buyer implements Serializable { 
    ... 
    @ElementCollection 
    private List<ContactDetails> contacts; 
    ... 
} 

मैं काफी आसानी से इस काम कर दिया है जब संग्रह एक बुनियादी प्रकार हैं, लेकिन मेरे ContactDetails एक @Embeddable वर्ग है:

@Embeddable 
public class ContactDetails implements Serializable { 
    ... 
    @Column(nullable = false) 
    private String streetOne; 
    .... 
} 

जब मैं हाइबरनेट DDL उत्पन्न करते हैं चलाते हैं, मैं इस तरह त्रुटियों मिलती है:

INFO - Environment    - Hibernate 3.5.6-Final 
.... 
INFO - Version     - Hibernate EntityManager 3.5.6-Final 
.... 
INFO - SettingsFactory   - RDBMS: PostgreSQL, version: 8.4.2 
INFO - SettingsFactory   - JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 9.0 JDBC4 (build 801) 
INFO - Dialect     - Using dialect: org.hibernate.dialect.PostgreSQLDialect 
.... 
ERROR - SchemaUpdate    - Unsuccessful: create table Buyer_contacts (Buyer_id int8 not null, contacts_collection&&element_county varchar(255), contacts_collection&&element_email varchar(255), contacts_collection&&element_fax varchar(255), contacts_collection&&element_mainphone varchar(255) not null, contacts_collection&&element_mobile varchar(255), contacts_collection&&element_name varchar(255) not null, contacts_collection&&element_postcode varchar(255) not null, contacts_collection&&element_streetone varchar(255) not null, contacts_collection&&element_streettwo varchar(255), contacts_collection&&element_town varchar(255) not null) 
ERROR - SchemaUpdate    - ERROR: syntax error at or near "&&" Position: 73 

वहाँ पीढ़ी को हाइबरनेट को मनाने के लिए एक रास्ता है संग्रह वर्ग के लिए तालिका में वैध कॉलम नाम मिटाएं? आदर्श रूप में, एक तरीका है कि का उल्लंघन नहीं करता अपने आप को प्रत्येक व्यक्ति के स्तंभ नाम निर्दिष्ट द्वारा सिद्धांत दोहराएँ न करें।

उत्तर

12

यह DefaultComponentSafeNamingStrategy की असंगतता के कारण @ElementCollection कार्यान्वयन विवरण के साथ हाइबरनेट में एक बग है।

.collection&&element. एक आंतरिक प्लेसहोल्डर है कि एक स्तंभ नाम के रूप में संपत्ति के नाम के उपयोग से पहले हटा दिया जाना चाहिए। अन्य नामकरण रणनीतियों को प्रभावी ढंग से, पिछले . के बाद संपत्ति नाम का ही हिस्सा का उपयोग करके इसे हटाने जबकि DefaultComponentSafeNamingStrategy_ के साथ बदलता है . रों लेकिन प्लेसहोल्डर हटाया नहीं जाता।

public class FixedDefaultComponentSafeNamingStrategy extends DefaultComponentSafeNamingStrategy { 
    @Override 
    public String propertyToColumnName(String propertyName) { 
     return super.propertyToColumnName(
      propertyName.replace(".collection&&element.", ".")); 
    } 
} 

की सूचना दी: HHH-6005

आप वास्तव में DefaultComponentSafeNamingStrategy की जरूरत है, यहाँ एक समाधान नहीं है।

+0

यही था, धन्यवाद। –

+0

बग ट्रैकर के अनुसार इस हाइबरनेट 5. –

+0

में तय हो गई है यह पता लगाने के लिए मुझे कई घंटे लग गए। त्रुटि संदेश बहुत अच्छी तरह से छुपा पूरे डीडीएल लॉग था। धन्यवाद! – Mateusz

-6

हमने जावा पर्सिस्टेंस एपीआई स्पेक 1.0 & 2.0 का नया कार्यान्वयन बैटू जेपीए जारी किया है, जिसमें प्रदर्शन मुख्य फोकस है। यह 15x गुना तेज है तो हाइबरनेट। परियोजना वेबसाइट http://batoo.jp

मैं Batoo जेपीए के खिलाफ अपने मामले की कोशिश की है और यह ठीक चलाता है। आप BAU जेपीए here में @ElementCollection के लिए यूनिट परीक्षण भी देख सकते हैं।

सम्मान।

2

वैकल्पिक वैकल्पिक हल @AttributeOverrides का उपयोग कर:

/** 
* <!-- begin-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> 
* User assignments (place managers, staffs, etc.). <!-- end-model-doc --> 
* 
*/ 
@ElementCollection() 
// Workaround for https://hibernate.atlassian.net/browse/HHH-6005 
@AttributeOverrides({ 
    @AttributeOverride(name="personId", [email protected](name="personId")), 
    @AttributeOverride(name="placeRoleId", [email protected](name="placeRoleId")) 
}) 
private Set<PlaceMember> members = new HashSet<PlaceMember>(); 
संबंधित मुद्दे