簡體   English   中英

Hibernate Annotatoin-如何連接具有多對多關系的三個表

[英]Hibernate Annotatoin - How to Join Three Tables with many to many relationship

  1. 我有3個實體USER,APPLICATION和ROLE。

    1. 我希望將ID連接到名為USER_APP_ROLE(user_ID,application_ID,role_ID)的表中,並且它們之間具有多對多關系。
    2. 我想要這種結構的原因是-我要求允許用戶處理具有多個角色的多個應用程序。
    3. 我已經完成以下代碼:

    User.java @ManyToMany(targetEntity = Role.class)@JoinTable(name =“ USER_APPLICATION_ROLE”,joinColumns = @ JoinColumn(name =“ USER_ID”),inverseJoinColumns = @ JoinColumn(name =“ ROLE_ID”))私有集合角色;

      @ManyToMany (targetEntity=Application.class) @JoinTable(name="USER_APPLICATION_ROLE", joinColumns=@JoinColumn(name="USER_ID"), inverseJoinColumns=@JoinColumn(name="APPLICATION_ID")) private Collection<Application> applications; Role.java @ManyToMany(mappedBy="roles", targetEntity=User.class) private Collection<User> users = new ArrayList<User>(); Application.java @ManyToMany(mappedBy="applications", targetEntity=User.class) private Collection<User> users = new ArrayList<User>(); 
    1. 當我嘗試運行以下測試時:

    。user.getRoles()添加(基於role1); 。user.getRoles()添加(基於role2);

    。role1.getUsers()添加(用戶); 。role1.getUsers()添加(用戶);

    。role2.getUsers()添加(用戶); 。role2.getUsers()添加(用戶);

    。user.getApplications()添加(APP1); 。user.getApplications()添加(APP2);

    。app1.getUsers()添加(用戶); 。app2.getUsers()添加(用戶);

    ......

    session.beginTransaction(); session.save(用戶); session.save(基於role1); session.save(role2所); session.save(APP1); session.save(APP2);

     I get the following error: Hibernate: select seq_cm_user.nextval from dual Hibernate: select seq_role.nextval from dual Hibernate: select seq_role.nextval from dual Hibernate: select seq_application.nextval from dual Hibernate: select seq_application.nextval from dual Hibernate: insert into CM_USER (EMAIL, FIRST_NAME, LAST_NAME, MIDDLE_NAME, USERNAME, ID) values (?, ?, ?, ?, ?, ?) Hibernate: insert into CM_ROLE (DESCRIPTION, ID) values (?, ?) Hibernate: insert into CM_ROLE (DESCRIPTION, ID) values (?, ?) Hibernate: insert into CM_APPLICATION (CODE, DESCRIPTION, ID) values (?, ?, ?) Hibernate: insert into CM_APPLICATION (CODE, DESCRIPTION, ID) values (?, ?, ?) Hibernate: insert into USER_APPLICATION_ROLE (USER_ID, APPLICATION_ID) values (?, ?) Hibernate: insert into USER_APPLICATION_ROLE (USER_ID, APPLICATION_ID) values (?, ?) Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1179) at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) at com.hp.gdas.capman.HibernateTest.main(HibernateTest.java:73) Caused by: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("SYSTEM"."USER_APPLICATION_ROLE"."ROLE_ID") at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10657) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 14 more 

    6,我可能做錯了方向,如果我完全做錯了方向,請幫助我並建議其他選擇。

謝謝。

似乎您希望USER_APPLICATION_ROLE表包含應用程序中對用戶的角色分配。 但這不是您的映射所做的。 它的作用是使用此表來包含用戶的角色(忽略應用程序)以及用戶的應用程序(忽略角色)。

因此,您的映射是錯誤的。 您需要將USER_APPLICATION_ROLE表映射為一個實體,因為它不是兩個實體之間的純聯接表。 例如,您可以將其命名為UserApplicationRole。 用戶將與UserApplicationRole具有OneToMany關聯。 UserApplicationRole將與User,Role和Application擁有ManyToOne關聯。 我強烈建議您向此表添加一個自動生成的ID列,就像所有實體一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM