سؤال

لدي كيانان/جداول.

أحدهما كيان مناسب، دعنا نسميه data.يحتوي على عدد من الحقول التي تحتوي على ما يسمى بـ "رموز متعددة اللغات".

الجدول الثاني , code, ، يحتوي على القيم متعددة اللغات نفسها.

فيما يلي بعض البيانات النموذجية:

Data table
id  name         continentCode  countryCode 
------------------------------------
1   Toto         EU             CH
2   Titi         AS             CN

Code table
id  code   language  text
----------------------------
1   EU     EN        Europe
2   EU     FR        Europe
3   EU     DE        Europa
4   CH     EN        Switzerland
5   CH     FR        Suisse
6   CH     DE        Schweiz
... etc

أرغب في تعيين خصائص القارات والبلدان وما إلى ذلك في كيان البيانات كخريطة، مثل هذا:

@OneToMany()
@MapKey(name="languageCode")
private Map<String, Code> continents;

حتى أتمكن بعد ذلك من قراءة النص للغة الصحيحة مثل هذا:

Data toto = dao.findByName("Toto");
String text = toto.getContries.get("FR").getText(); //--> returns "Suisse"
String text = toto.getContries.get("EN").getText(); //--> returns "Switzerland"

أحتاج أيضًا إلى أن أكون قادرًا على إجراء بحث نصي حول قيم هذه "الرموز"، باستخدام لغة المستخدم.(على سبيل المثالاحصل على جميع البيانات حيث البلد='suisse'، باللغة الفرنسية!)

إذن، هل من الممكن رسم خريطة أ OneToMany التجميع باستخدام حقل مفتاح ليس المفتاح الأساسي للكيان الحالي؟أحتاج إلى مجموعة القارات الخاصة بي "جميع السجلات من جدول Code حيث الرمز = قيمة my continentCode ملكية".أو ربما هناك طريقة أكثر ملاءمة لتمثيل هذا النوع من العلاقات؟

ملحوظة:لسوء الحظ لا أستطيع تغيير مخطط SQL ...

هل كانت مفيدة؟

المحلول

حسنًا، لقد وجدت الحل.يبدو تعيين OneToMany على كيان البيانات الخاص بي كما يلي:

@OneToMany()
@JoinColumn(name="code", referencedColumnName="continentCode", insertable=false, updatable=false)   
@MapKey(name="languageCode")
private Map<String, AAGeoContinentThesaurusEntry> continents;

اضطررت أيضًا إلى تعيين عمود ContinentCode حتى يعمل.أنا لم أفعل ذلك، حصلت على:

org.hibernate.MappingException: Unable to find column with logical name: GCH_CDE_CODE_CNT in org.hibernate.mapping.Table
(GCHDATA) and its related supertables and secondary tables
        at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:396)
        at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:102)

الآن أستطيع أن أفعل:

myData.getContinentCodes().get("FR").getText() 

واحصل على السلسلة "أوروبا" :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top