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>