Java 在hibernate中将多个集合映射到一个表中

Java 在hibernate中将多个集合映射到一个表中,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我有一个用户一个日志类(我无法更改): 我的问题是,在hibernate中,如何将这两个集合(accessLogs和actionLogs)映射到同一个表中,为日志生成以下模式: user_logs +---------+---------------+---------------------+--------+ | user_id | what | when | type | +---------+---------------+------

我有一个
用户
一个
日志
类(我无法更改):

我的问题是,在hibernate中,如何将这两个集合(
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代码并按原样设置语义。我正在寻找类似鉴别器、公式或HibernateAPI扩展之类的东西,它们可以在不涉及Java代码的情况下解决这个问题。可能是这样的(下面是假想的hibernate配置):


...
...

Edit2:我还没有一个完整的解决方案。我相信这是可以做到的,可能是通过扩展一些hibernate API。

为什么不把列表合并成一个列表呢?您的两个列表属于同一类


编辑-如果希望保留两个列表,则创建第三个列表作为组合,并仅保留该组合。您必须控制对这两个列表的访问者的访问,以便知道何时更新第三个列表,但这不太难。

您是否尝试以这种方式映射集合:

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

正如Maurizio所写,您需要使用
where
属性仅检索属于每个集合的行

要使用附加列插入行,需要在
中添加以下元素:


有趣的是:我使用NHibernate编写并测试了它,但它是直接移植的,所以它的工作原理应该完全相同。

我只想通过更改hibernate映射代码来解决这个问题。@cherouvim如果有2个集合,则需要映射这些集合。如果您想要一个集合,您必须更改代码。我需要两个集合,我可以映射它们,但我希望它们映射到一个表。@cherouvim,然后尝试创建第三个集合,就像我在回答中建议的那样,并映射它--然后您有一个持久集合,您的域逻辑在这两个集合上工作…第三个集合可以完成这项工作,但我需要知道这是否只能通过配置或hibernate扩展来解决。谢谢,这太棒了。现在,我只需要找到一种方法,将“访问权限”注入到我的模型中不存在的类型列中。+1这是我在类似情况下所做的,它工作得很好。是的,但我无法区分访问日志和操作日志,因为user\u logs表只有
user\u id
what
时。我需要通过hibernate配置来完成。我不能修改或扩展我的模型。那么,只有这样才能链接where条件:where=“what=”logged in”或what='what else''
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 |
+---------+---------------+---------------------+
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 |
+---------+---------------+---------------------+--------+
<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>
<set name="accessLogs" table="user_logs" where="type='access'">    
<sql-insert>
  insert into user_logs(user_id, what, [when], type)
  values(?, ?, ?, 'access')
</sql-insert>
<database-object>
  <create>alter table user_logs add type char(6)</create>
  <drop></drop>
</database-object>