سؤال

لديّ تطبيق-إثراء في الربيع يفشل في تعيين كائن ما بشكل صحيح: في الأساس لدي كائنان مجالان ، أ Post و User. الدلالات هي أن كل منشور لديه مستخدم مقابل واحد.

ال Post يبدو كائن المجال تقريبًا على النحو التالي:

class Post {

  private int pId;
  private String attribute;
  ...
  private User user;

  //getters and setters here

}

كما ترى، Post يحتوي على إشارة إلى User. عندما أقوم بتحميل أ Post كائن ، أريد المقابلة User كائن ليتم تحميله (بتكاسل - فقط عند الحاجة).

يبدو أن رسم الخرائط الخاص بي على النحو التالي:

<class name="com...Post" table="post">
    <id name="pId" column="PostId" />
    <property name="attribute" column="Attribute" type="java.lang.String" />

    <one-to-one name="User" fetch="join"
        class="com...User"></one-to-one>
</class>

وبالطبع لدي رسم خرائط أساسي ل User اقامة.

بقدر ما يتعلق الأمر بمخطط الجدول الخاص بي ، لدي طاولة تسمى post مع أجنبي UserId الذي يرتبط بـ user الطاولة.

اعتقدت أن هذا الإعداد يجب أن يعمل ، ولكن عندما أقوم بتحميل صفحة تجبر التحميل البطيء لـ User كائن ، لاحظت أن الاستعلام التالي الذي يتم إنشاؤه:

Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...

من الواضح أن هذا خطأ: يجب أن ينضم UserId من عند post مع UserId من عند user, ، ولكن بدلاً من ذلك ينضم بشكل غير صحيح PostId من عند post (مفتاحه الأساسي) مع UserId من عند user.

أيه أفكار؟ شكرًا!

تحديث: بفضل اثنين من المنشورات أدناه ، أدرك الآن أنه كان ينبغي عليّ أن أستخدم تعيينًا كبيرًا بدلاً من فرد إلى واحد. لقد غيرت الخرائط تحت post الى الآتى الى القادم الى الم:

<many-to-one name="User" class="com...User" column="uId"/>

لكن الآن أحصل على خطأ في وقت التشغيل أخبرني أنه لا توجد سمة تسمى uId. هذا أمر منطقي لأنني لا أملك ملف uId عمود في بلدي post كائن المجال (لدي ببساطة إشارة إلى user هدف). الآن أنا في حيرة من أمري بشأن كيف يمكنني الحصول على السبات لإدراك أنه يحتاج إلى تعيين مفتاح غريب من جدول النشر إلى جدول المستخدم. يجب أن تضيف صراحة uId تنسب إلى بلدي post كائن المجال ليكون أ عنصر نائب للمفتاح الخارجي؟

آمل أن أكون منطقيا ...

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

المحلول

نظرًا لأن المستخدم لديه العديد من المنشورات ، فإن ارتباطك هو في الواقع "كثير إلى واحد" ، وليس "فرديًا". يجب أن تعمل إذا قمت بتخطيطها وفقًا لذلك.

تعديل: نعم ، يمكنك تعيين post.user الخاصية على المنشور مع "العديد من واحد إلى واحد" ، أو set user.posts في المستخدم مع "واحد إلى كثير" ، أو كليهما. هل حددت اسم عمود المفاتيح الخارجية؟

EDIT2: في سباتية الكلام ، يتم تعيين "عمود" في قاعدة البيانات إلى "خاصية" في فئة Java الخاصة بك. أي أن سمة العمود تحتوي على اسم عمود المفاتيح الخارجية في قاعدة البيانات ، وليس اسم أي خاصية في فئة Java الخاصة بك. إذا قرأت سؤالك بشكل صحيح ، فيجب عليك استخدام "userId" ، وليس "UID".

أوه ، ولا يمكن أن يكون جلب = "Join" كسولًا ، لأنه يفرض أن المستخدم يتم جلبه في نفس الاستعلام مثل المنشور.

نصائح أخرى

هذا هو سلوك رسم الخرائط الفردي. عادة ما يشتركون في مفتاح أساسي. يفترض Hibernate أن المفتاح الأساسي للنشر هو نفس المفتاح الرئيسي للمستخدم. هذه الصفحة يلخص هذا السلوك.

أظن أن مستخدمًا واحدًا يمكن أن يكون لديه بالفعل أكثر من منشور واحد. هذا يجعل رسم الخرائط الخاص بك واحد إلى رجل.

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