Hibernate:如何在注释中的一个联接表中联接三个3表?
你能帮我把三个表和一个常用的连接表连接起来吗? 我有用户、应用程序和角色表。 我希望它们的ID加入一个名为USER\u APP\u ROLE(USER.ID、application.ID、ROLE.ID)的表中 当我在多对多联接中删除应用程序表或角色表时,我的代码正在工作 我已完成以下代码: User.javaHibernate:如何在注释中的一个联接表中联接三个3表?,hibernate,many-to-many,jointable,Hibernate,Many To Many,Jointable,你能帮我把三个表和一个常用的连接表连接起来吗? 我有用户、应用程序和角色表。 我希望它们的ID加入一个名为USER\u APP\u ROLE(USER.ID、application.ID、ROLE.ID)的表中 当我在多对多联接中删除应用程序表或角色表时,我的代码正在工作 我已完成以下代码: User.java @ManyToMany (targetEntity=Role.class) @JoinTable(name="USER_APPLICATION_ROLE", joinColumn
@ManyToMany (targetEntity=Role.class)
@JoinTable(name="USER_APPLICATION_ROLE",
joinColumns=@JoinColumn(name="USER_ID"),
inverseJoinColumns=@JoinColumn(name="ROLE_ID"))
private Collection<Role> roles;
@ManyToMany (targetEntity=Application.class)
@JoinTable(name="USER_APPLICATION_ROLE",
joinColumns=@JoinColumn(name="USER_ID"),
inverseJoinColumns=@JoinColumn(name="APPLICATION_ID"))
private Collection<Application> applications;
我得到以下错误:
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
多谢各位 问题在于您已经定义了与角色的关系和与应用程序的单独关系。没有声明任何特定用户是一个角色和一个应用程序的联接 当您尝试与角色关联时,应用程序为空,反之亦然 下面是一个使用JPA在类
a
、B
和C
之间映射三向联接的示例。注意,联接表不需要任何实体
@Entity
public class A {
@JoinTable(name = "a_b_c",
joinColumns = @JoinColumn(name = "a_id"),
inverseJoinColumns = @JoinColumn(name = "c_id"))
@MapKeyJoinColumn(name = "b_id")
@ElementCollection
private Map<B, C> cByB = new HashMap<>();
}
@Entity
public class B {
...
}
@Entity
public class C {
...
}
@实体
公共A类{
@JoinTable(name=“a_b_c”,
joinColumns=@JoinColumn(name=“a_id”),
inverseJoinColumns=@JoinColumn(name=“c_id”))
@MapKeyJoinColumn(name=“b_id”)
@元素集合
私有映射cByB=newhashmap();
}
@实体
公共B级{
...
}
@实体
公共C类{
...
}
@Synesso、B和C类需要许多关系。我面临这样的错误:线程“main”java.lang.IllegalStateException中的异常:集合元素(多对多)表别名不能为空这不允许我拥有(1,1,1)、(1,2,1)等所有可能性。如何实现?@Synesso-你能在这里指导我吗:?你能解决这个问题吗?
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(user);
session.save(role1);
session.save(role2);
session.save(app1);
session.save(app2);
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
@Entity
public class A {
@JoinTable(name = "a_b_c",
joinColumns = @JoinColumn(name = "a_id"),
inverseJoinColumns = @JoinColumn(name = "c_id"))
@MapKeyJoinColumn(name = "b_id")
@ElementCollection
private Map<B, C> cByB = new HashMap<>();
}
@Entity
public class B {
...
}
@Entity
public class C {
...
}