如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体

Posted

技术标签:

【中文标题】如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体【英文标题】:How to do Hibernate XML-Mapping, for one-to-many using 1 PK to map to another Entity with Composite Keys 【发布时间】:2012-01-10 07:05:22 【问题描述】:

我在尝试将一个实体映射到另一个具有 Composite-PK 的实体时遇到了一个大问题... 我在这里想要实现的是,1 个用户可以有很多任务,每个任务包含很多模块和它的动作

|用户 | (用户名,姓名) |用户权限 | (用户 IDTaskId) |任务 | (TaskIdModuleIdActionId) |行动 | (ActionId,ActionName) |模块 | (ModuleId,ModuleName)

在我的 User.hbm.xml <set name="tasklist" table="UserRight" cascade="all"> <key column="user_id" /> <many-to-many column="task_id" unique="true"class="kodi.model.UserRights.Task" /> </set>

我收到此错误

SEVERE: Initial SessionFactory creation failed.org.hibernate.MappingException: Foreign key  (FK8AF2ACF15756F47C:UserRight [task_id])) must have same number of columns as the referenced primary key (task [task_id,submodule_id,action_id])
WARNING: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception
java.lang.ExceptionInInitializerError
    at kodi.gen.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:23)
    at kodi.gen.util.HibernateUtil.<clinit>(HibernateUtil.java:14)
    at kodi.view.LoginAction.<init>(LoginAction.java:22)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)

我知道问题是因为,我试图只使用 1 个属性来映射到具有 3 个属性的集合,但我真的不知道如何解决它。

有人可以帮忙吗?

【问题讨论】:

为什么任务有compositeId? TaskId 不是唯一的吗? 嗨 Firo,是的,你说得有道理.. 该死!.. 但如果在这种情况下我无法唯一识别任务,有没有办法为这样的映射做些什么? 【参考方案1】:

最简单和最好的方法是使 taskid 唯一并将其映射为 id。

如果不行,你可以试试&lt;many-to-many property-ref="TaskId"/&gt;&lt;many-to-many property-ref="Id"/&gt;

【讨论】:

以上是关于如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体的主要内容,如果未能解决你的问题,请参考以下文章

hibernate实体xml一对多关系映射

Mybatis框架中实现一对多关系映射

如何在hibernate struts2中进行一对多映射

Hibernate一对多单向(双向)关联映射

hibernate多对多映射中间表有多余字段问题该如何映射

Hibernate映射关系:一对一对多和多对多