【发布时间】:2014-01-22 00:00:24
【问题描述】:
-
我有 3 个实体 USER、APPLICATION 和 ROLE。
- 我希望将 ID 连接到名为 USER_APP_ROLE(user_ID, application_ID, role_ID) 的表中,它们之间存在多对多关系。
- 我想要这种结构的原因是 - 我需要允许用户处理具有多个角色的多个应用程序。
- 我做了以下代码:
用户.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>();- 当我尝试运行以下测试时:
user.getRoles().add(role1); user.getRoles().add(role2);
role1.getUsers().add(user); role1.getUsers().add(user);
role2.getUsers().add(user); role2.getUsers().add(user);
user.getApplications().add(app1); user.getApplications().add(app2);
app1.getUsers().add(user); app2.getUsers().add(user);
......
session.beginTransaction(); 会话.保存(用户); 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 more6.我可能做错了方向。如果我完全做错了,请帮助并建议我任何替代方法。感谢任何帮助。
谢谢。
【问题讨论】:
-
这根本与您的 ORM 结构无关;您将
null插入到不允许该列为null的表中。我们对您的 DDL 了解不足,无法告诉您它发生在哪里;您应该弄清楚哪些列是明确的NOT NULL,并确保您设置的数据尊重这一点。 -
@Makoto :我不太关心错误。我关心如何在 Hibernate 中实现此要求(即 User-App-Role 映射)。我只是根据我的知识创建,所以我得到了错误。由于我是 Hibernate 的新手,你能举个例子来满足这个映射吗?
标签: java hibernate nhibernate-mapping hibernate-annotations