سؤال

لدي User أ Log الفصل (الذي لا يمكنني تغييره):

class User {
    private long id;
    private String name;
    private Set<Log> accessLogs;
    private Set<Log> actionLogs;
}

class Log {
    private String what;
    private Date when;
}

سيبدو رسم الخرائط المحتمل:

<class name="com.example.User" table="users">
    <id name="id" access="field">
        <generator class="native" />
    </id>

    <property name="name" length="256" />

    <set name="accessLogs" table="user_access_logs" cascade="all-delete-orphan" order-by="`when`">
        <key column="user_id" />
        <composite-element class="com.example.Log">
            <property name="what" length="512" />
            <property name="when" column="`when`" />
        </composite-element>
    </set>

    <set name="actionLogs" table="user_action_logs" cascade="all-delete-orphan" order-by="`when`">
        <key column="user_id" />
        <composite-element class="com.example.Log">
            <property name="what" length="512" />
            <property name="when" column="`when`" />
        </composite-element>
    </set>

</class>

هذا يعمل بشكل جيد والخرائط على جداول قاعدة البيانات التالية:

users
+----+------+
| id | name |
+----+------+
|  1 | john |
|  2 | bill |
|  3 | nick |
+----+------+

user_access_logs
+---------+------------+---------------------+
| user_id | what       | when                |
+---------+------------+---------------------+
|       1 | logged in  | 2010-09-21 11:25:03 |
|       1 | logged out | 2010-09-21 11:38:24 |
|       1 | logged in  | 2010-09-22 10:19:39 |
|       2 | logged in  | 2010-09-22 11:03:18 |
|       1 | logged out | 2010-09-22 11:48:16 |
|       2 | logged in  | 2010-09-26 12:45:18 |
+---------+------------+---------------------+

user_action_logs
+---------+---------------+---------------------+
| user_id | what          | when                |
+---------+---------------+---------------------+
|       1 | edit profile  | 2010-09-21 11:28:13 |
|       1 | post comment  | 2010-09-21 11:30:40 |
|       1 | edit profile  | 2010-09-21 11:31:17 |
|       1 | submit link   | 2010-09-22 10:21:02 |
|       2 | submit review | 2010-09-22 11:10:22 |
|       2 | submit link   | 2010-09-22 11:11:39 |
+---------+---------------+---------------------+

سؤالي هو كيف يمكن أن يكون ذلك ممكنًا في السبات في تعيين هاتين المجموعتين (accessLogs و actionLogs) في نفس الجدول الذي ينتج المخطط التالي للسجلات:

user_logs
+---------+---------------+---------------------+--------+
| user_id | what          | when                | type   |
+---------+---------------+---------------------+--------+
|       1 | logged in     | 2010-09-21 11:25:03 | access |
|       1 | edit profile  | 2010-09-21 11:28:13 | action |
|       1 | post comment  | 2010-09-21 11:30:40 | action |
|       1 | edit profile  | 2010-09-21 11:31:17 | action |
|       1 | logged out    | 2010-09-21 11:38:24 | access |
|       1 | logged in     | 2010-09-22 10:19:39 | access |
|       1 | submit link   | 2010-09-22 10:21:02 | action |
|       2 | logged in     | 2010-09-22 11:03:18 | access |
|       2 | submit review | 2010-09-22 11:10:22 | action |
|       2 | submit link   | 2010-09-22 11:11:39 | action |
|       1 | logged out    | 2010-09-22 11:48:16 | access |
|       2 | logged in     | 2010-09-26 12:45:18 | access |
+---------+---------------+---------------------+--------+

يحرر: أريد الاحتفاظ برمز Java وضبط الدلالات كما هو. أنا أبحث عن شيء مثل التمييز أو صيغة أو امتداد API السبات الذي سيحل هذا دون لمس رمز Java. ربما شيء على طول الخطوط (يتبع تكوين السبات الخيالي):

<set name="accessLogs" table="user_logs" ... formula="type='access'">
    <key column="user_id" />
    <composite-element class="Log">
        ...
    </composite-element>
</set>

<set name="actionLogs" table="user_logs" ... formula="type='action'">
    <key column="user_id" />
    <composite-element class="Log">
        ...
    </composite-element>
</set>

EDIT2: ليس لدي حل كامل لهذا بعد. أنا متأكد من أنه يمكن القيام به ، ربما عن طريق توسيع نطاق واجهة برمجة تطبيقات السبات.

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

المحلول

كما كتب موريزيو ، تحتاج إلى استخدام where عزا لاسترداد الصفوف فقط التي تنتمي إلى كل مجموعة.

إلى إدراج صفوف باستخدام العمود الإضافي ، تحتاج إلى إضافة العنصر التالي داخل <set>:

<sql-insert>
  insert into user_logs(user_id, what, [when], type)
  values(?, ?, ?, 'access')
</sql-insert>

هذا يخبر السبات بشكل أساسي باستخدام SQL المحدد بدلاً من توليده. لاحظ أنه كان علي الهروب يدويًا when عمودي.

المكافأة: لإضافة العمود الإضافي إلى DB ، استخدم ما يلي (بعد إغلاق <class>)

<database-object>
  <create>alter table user_logs add type char(6)</create>
  <drop></drop>
</database-object>

قليلا مثيرة للاهتمام: لقد كتبت واختبرت هذا باستخدام nhibernate, ، ولكن تم نقلها مباشرة ، لذلك يجب أن تعمل بالضبط.

نصائح أخرى

هل حاولت تعيين تعيين بهذه الطريقة:

<set name="accessLogs" table="user_logs" where="type='access'">    

لماذا لا تعمل فقط على الجمع بين القوائم في قائمة واحدة؟ كل من قائمتك من نفس الفصل.

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

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