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?
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"/>