Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate在同时插入多个对象的两个对象时生成错误_Hibernate_Hibernate Mapping - Fatal编程技术网

Hibernate在同时插入多个对象的两个对象时生成错误

Hibernate在同时插入多个对象的两个对象时生成错误,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,我正在使用postgreql(如果有必要的话),我有两个类具有这种映射: <hibernate-mapping> <class name="com.mydomain.models.TokenizedForm" table="TOKENIZEDFORM"> <id name="id" type="java.lang.Integer"> <column name="ID" sql-type="INTEGER"/> <generator

我正在使用postgreql(如果有必要的话),我有两个类具有这种映射:

<hibernate-mapping>
<class name="com.mydomain.models.TokenizedForm" table="TOKENIZEDFORM">
 <id name="id" type="java.lang.Integer">
  <column name="ID" sql-type="INTEGER"/>
  <generator class="increment"/>
 </id>
 <property generated="never" lazy="false" name="name" type="java.lang.String">
  <column length="255" name="NAME" sql-type="VARCHAR"/>
 </property>
 <property generated="never" lazy="false" name="body" type="java.lang.String">
  <column length="9999999" name="BODY" sql-type="VARCHAR"/>
 </property>
 <set lazy="true" name="tokens" sort="unsorted" table="FORMTOKENS">
  <key>
   <column name="ID" sql-type="INTEGER"/>
  </key>
  <one-to-many class="com.mydomain.models.FormTokens"/>
 </set>
</class>
</hibernate-mapping>
其中3是FormToken的ID。不是数据库中的TokenizedForm。(tf0和tf1 id分别为2和3,因为我已将id为1的行插入到数据库中)。
如果我尝试只添加一个FormToken,它在每次运行中都会起作用!在一次运行期间添加两个或多个FormTokens实例时会出现此问题。通过在每次运行期间只添加一个FormTokens实例,我可以添加数以十亿计的FormTokens。
我尝试从TokenizedForm中删除FormTokens的任何跟踪,但是(从映射中删除集合和…),但没有任何区别,我甚至尝试在一次FormToken插入后提交并开始一个新事务。我也尝试关闭和打开一个新的会话!但同样的事情一次又一次地发生。
我做错了什么?

有关如何将双向关联映射到meny关联的信息,请参阅。您的映射是错误的,因为它表明

<set lazy="true" name="tokens" sort="unsorted" table="FORMTOKENS">
  <key>
   <column name="ID" sql-type="INTEGER"/>
  </key>
  <one-to-many class="com.mydomain.models.FormTokens"/>
</set>

formtokens中的ID列用于引用tokenizedforms表的主键。应该是

<set lazy="true" name="tokens" sort="unsorted" table="FORMTOKENS">
  <key>
   <column name="FORM" sql-type="INTEGER"/>
  </key>
  <one-to-many class="com.mydomain.models.FormTokens"/>
</set>


相反。当然,如果让Hibernate为您生成数据库模式,请确保从头开始重新生成数据库模式,因为它可能生成了一个FK约束,当您尝试完全删除此集合时,该约束没有被删除。

您是否尝试过form.getTokens().add(ft0)和form.getTokens().add(ft1)和session.saveOrUpdate(form)呢,您能否提供带有FK和PK详细信息的表结构
Hello World!
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select max(ID) from TOKENIZEDFORM
Hibernate: select max(ID) from FORMTOKENS
Hibernate: insert into TOKENIZEDFORM (NAME, BODY, ID) values (?, ?, ?)
Hibernate: insert into FORMTOKENS (TEXT, DELIMITER, FORM, ID) values (?, ?, ?, ?)
Hibernate: insert into FORMTOKENS (TEXT, DELIMITER, FORM, ID) values (?, ?, ?, ?)
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement
  at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:129)
  at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
  at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
  at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58)
  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3067)
  at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3509)
  at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
  at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
  at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)
  at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:286)
  at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)
  at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
  at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
  at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
  at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
  at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
  at com.mydomain.App.d(App.java:55)
  at com.mydomain.App.main(App.java:22)
Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "formtokens" violates foreign key constraint "fk_37kmr0diunms0vx0boagmc43f"
  Detail: Key (id)=(3) is not present in table "tokenizedform".
  at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
  at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
  at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
  ... 15 more
<set lazy="true" name="tokens" sort="unsorted" table="FORMTOKENS">
  <key>
   <column name="ID" sql-type="INTEGER"/>
  </key>
  <one-to-many class="com.mydomain.models.FormTokens"/>
</set>
<set lazy="true" name="tokens" sort="unsorted" table="FORMTOKENS">
  <key>
   <column name="FORM" sql-type="INTEGER"/>
  </key>
  <one-to-many class="com.mydomain.models.FormTokens"/>
</set>