بيات شتوى :تعيين OneToMany لا يعتمد على PK؟
-
26-09-2020 - |
سؤال
لدي كيانان/جداول.
أحدهما كيان مناسب، دعنا نسميه 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()
واحصل على السلسلة "أوروبا" :)