Java Hibernate注释-如何连接具有多对多关系的三个表

Java Hibernate注释-如何连接具有多对多关系的三个表,java,hibernate,nhibernate-mapping,hibernate-annotations,Java,Hibernate,Nhibernate Mapping,Hibernate Annotations,我有3个实体用户、应用程序和角色 我希望这些ID加入到名为USER\u APP\u ROLE(USER\u ID、application\u ID、ROLE\u ID)的表中,它们之间具有多对多关系 我想要这种结构的原因是——我需要允许用户使用多个角色处理多个应用程序 我已完成以下代码: User.java @ManyToMany(targetEntity=Role.class) @JoinTable(name=“用户\应用程序\角色”, joinColumns=@JoinColumn(name

我有3个实体用户、应用程序和角色

  • 我希望这些ID加入到名为USER\u APP\u ROLE(USER\u ID、application\u ID、ROLE\u ID)的表中,它们之间具有多对多关系
  • 我想要这种结构的原因是——我需要允许用户使用多个角色处理多个应用程序
  • 我已完成以下代码:
  • User.java @ManyToMany(targetEntity=Role.class) @JoinTable(name=“用户\应用程序\角色”, joinColumns=@JoinColumn(name=“USER\u ID”), inverseJoinColumns=@JoinColumn(name=“ROLE\u 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>();
    
    6.我可能做得不对。如果我完全做得不对,请帮助并建议我任何替代方案。任何帮助都将不胜感激


    谢谢。

    您似乎希望USER\u APPLICATION\u ROLE表包含将角色分配给应用程序中的用户。但这不是映射所做的。它所做的是使用此表来包含用户的角色(忽略应用程序),以及用户的应用程序(忽略角色)


    因此,您的映射是错误的。您需要将USER\u APPLICATION\u ROLE表映射为一个实体,因为它不是两个实体之间的纯联接表。例如,您可以将其命名为UserApplicationRole。用户将与UserApplicationRole建立OneToMany关联。UserApplicationRole将与用户、角色和应用程序有多个One关联。我强烈建议您向该表中添加一个自动生成的ID列,就像您的所有实体一样。

    您似乎希望USER\u APPLICATION\u ROLE表包含应用程序中用户的角色分配。但这不是映射所做的。它所做的是使用此表来包含用户的角色(忽略应用程序),以及用户的应用程序(忽略角色)


    因此,您的映射是错误的。您需要将USER\u APPLICATION\u ROLE表映射为一个实体,因为它不是两个实体之间的纯联接表。例如,您可以将其命名为UserApplicationRole。用户将与UserApplicationRole建立OneToMany关联。UserApplicationRole将与用户、角色和应用程序有多个One关联。我强烈建议您向该表中添加一个自动生成的ID列,就像您的所有实体一样。

    这与您的ORM结构无关;您正在将
    null
    插入到不允许该列为
    null
    的表中。我们对您的DDL了解不够,无法告诉您发生在哪里;您应该确定哪些列显式地
    不为NULL
    ,并确保您设置的数据尊重这一点。@Makoto:我不太担心错误。我关心的是如何在Hibernate中实现这一要求(即用户应用程序角色映射)。我只是根据我的知识创建,所以我得到了一个错误。因为我是Hibernate新手,你能举个例子来满足这个映射吗;您正在将
    null
    插入到不允许该列为
    null
    的表中。我们对您的DDL了解不够,无法告诉您发生在哪里;您应该确定哪些列显式地
    不为NULL
    ,并确保您设置的数据尊重这一点。@Makoto:我不太担心错误。我关心的是如何在Hibernate中实现这一要求(即用户应用程序角色映射)。我只是根据我的知识创建,所以我得到了错误。因为我是新加入Hibernate的,你能给我一个例子来满足这个映射吗?我是新加入Hibernate的。所以如果可能的话,你能创建一个快速的例子来说明你的评论吗?如果我想知道“用户”(例如Hemant),也可以使用Hibernate查询处理哪个应用程序以及他在每个应用程序上的角色。下面是我的示例表结构表数据用户1.Hemant 2.Andrew 3.Clerk`application 1.App1 2.App2`Role 1.Read 2.Write 3.delete这太好了,谢谢你的启发性回答。我是新来hibernate的。因此,如果可能的话,你可以创建一个快速的例子来说明你的评论。如果我想了解“用户”(例如Hemant),也可以使用hibernate查询处理哪个应用程序以及他在每个应用程序中的角色。下面是我的示例表结构表数据用户1.Hemant 2.Andrew 3.Clerk`Application 1.App1 2.App2`Role 1.Read 2.Write这太好了,谢谢你富有启发性的回答。
    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