当前位置: 首页 > 知识库问答 >
问题:

Hibernate注释--如何用多对多关系连接三个表

顾嘉德
2023-03-14

>

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

      null
      @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>();
    
      null

    Role1.getUsers().Add(user);Role1.getUsers().Add(user);

    role2.getUsers().add(user);role2.getUsers().add(user);

    user.getApplications().add(app1);user.getApplications().add(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
    

    多谢了。

  • 共有1个答案

    胡和煦
    2023-03-14

    您似乎希望USER_APPLICATION_ROLE表包含对应用程序中用户的角色分配。但这不是你的地图所能做的。它所做的是使用这个表来包含用户的角色(忽略应用程序),以及用户的应用程序(忽略角色)。

    因此,您的映射是错误的。您需要将USER_APPLICATION_ROLE表映射为一个实体,因为它不是两个实体之间的纯连接表。例如,可以将其命名为UserApplicationRole。用户将与UserApplicationRole有一个单独的关联。UserApplicathtml" target="_blank">ionRole将与User以及与Role和与Application有ManyToOne关联。并且我强烈建议您向此表添加一个自动生成的ID列,就像为您的所有实体一样。

     类似资料:
    • 我想使用联接表在两个表之间建立一对多关系。 这就是为什么我想使用联接表: Hibernate单向一对多关联-为什么连接表更好 最后,我想使用Hibernate注释来执行此操作。 我找到了一些使用xml映射实现这一点的示例,但没有使用注释。 我相信这将是如何创建表需要

    • 我有一个关于Hibernate ManyToMany映射的问题。我有两个类 A 和 B,它们之间的映射是由 Hibernate 解析的 ManyToMany 映射: 用户和组的外键是“A_id”和“B_id”。联接表称为A_B。 现在,我想加上C。我想A_B与C有关系,与C创建多对多关系,A_B我可以称之为A_B_C。 编辑:所以我会创建一个_B实体,A和B和A_B的关系为2 @OneToMany

    • 问题内容: 我有2张桌子: 电影:movieID 用户:userID 这些表通过Queue表具有多对多关系,并带有一个附加属性listOrder: 队列:movieID,userID,listOrder 我正在尝试使用EclipseLink对此模型建模,但是却收到“不兼容映射”错误。这是我的代码的示例: QueueItemPK的目的是使我可以拥有movieID和userID的复合主键。我不确定这是

    • 在我的应用程序中,用户和首选项实体之间存在多对多关联。由于连接表需要一个额外的列,因此我必须将其分解为2个一对多的关联: 用户实体: 偏好实体: 用户首选项实体: 为了更新其中一个首选项,我循环浏览用户的一组首选项,并更新值如下: 我已经确认,我试图更新的用户变量在代码运行后确实包含新值。更奇怪的是,当重定向发生时,该值会在网页上更新,但数据库不会更新!这是我用来做更新的代码,这个类用@Trans

    • 我有两个类:< code>User和< code>UserProfile。 用户类别: 用户配置文件类: 当我使用此代码时,我在具有多对多关系的表用户配置文件中获得重复的实体。我使用 函数来保存对象。我做错了什么? 然后我删除 cascadeType,出现错误:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 Hibernate日志:

    • 我试图使用Hibernate标准来选择,使用多对多关系中相关的表。n-m表有一些附加列,而不仅仅是每个表的ID。 java.lang.IllegalArgumentException:无法在此ManagedType[User]上找到具有给定名称[UserRolesList.Role]的属性 我已经为这种情况尝试了许多选择,比如加入,但仍然无法使其工作。