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

发布于 2024-12-25 14:56:50 字数 1748 浏览 1 评论 0原文

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

|用户 | (用户 ID,名称)
|用户权利 | (用户 ID任务 ID
|任务| (任务 ID模块 ID操作 ID
|行动| (操作 ID,操作名称)
|模块| (ModuleId, ModuleName)

在我的 User.hbm.xml
<键列=“user_id”/> <多对多列=“task_id”唯一=“true”class=“kodi.model.UserRights.Task”/>

并且我收到此错误

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 个属性的集合,但我真的不知道如何解决它。

有人可以帮忙吗?

I'm having a big problem trying to do map an entity to another that has a Composite-PK...
What i'm trying to achieve here is, 1 User can have many Task, and Each Task contains many Modules and It's Action

| User | (Userid, Name)
| UserRight | (Userid, TaskId)
| Task | (TaskId, ModuleId, ActionId)
| Action | (ActionId, ActionName)
| Module | (ModuleId, ModuleName)

in my 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>

and i receive this error

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)

I know the problem is becoz, i'm trying to only use 1 Attribute to map to a set with 3 but i'm really not sure how to solve it.

can anybody please help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空‖城人不在 2025-01-01 14:56:50

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

如果不可能,您可以尝试 ;

the easiest and best way would be to make taskid unique and map it as id.

If not possible you can try <many-to-many property-ref="TaskId"/> or <many-to-many property-ref="Id"/>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文