1

当我尝试存储包含地图的实体时遇到以下问题。

这就是我的实体的样子:

public Class MyEntity {
   private Map<EnumType, MyEmbedabble> map;
   .....

这是 orm.xml 文件中的相关部分:

<element-collection name="map" target-class="my.package.MyEmbedabble">
            <map-key-enumerated>STRING</map-key-enumerated>
            <map-key-column name="map_key"/>
            <collection-table>
                <join-column name="entityId"/>
            </collection-table>
 </element-collection>

当我存储一个实体对象时它工作得很好,但我注意到当我再次存储该对象时,元素集合的表中的条目出现多次。一旦发生这种情况,我尝试编辑并保存现有的地图条目,我会收到以下异常:

Caused by: org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update [0]; actual row count: 5; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:89)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:57)
at org.hibernate.persister.collection.BasicCollectionPersister.doUpdateRows(BasicCollectionPersister.java:258)
at org.hibernate.persister.collection.AbstractCollectionPersister.updateRows(AbstractCollectionPersister.java:1630)
at org.hibernate.action.internal.CollectionUpdateAction.execute(CollectionUpdateAction.java:85)

我非常感谢您对此的任何意见!

谢谢!

4

1 回答 1

1

我有一个类似的问题。在我的例子中,我使用了一个实体,它更新了另一个表中的记录(我有一个一对多的关系——一个“主要”对象和一个单独表中的“次要”对象列表)。我的设置正在尝试更新另一个表。这在创建和更新方法上工作得很好,但是当我尝试删除一个对象时,我得到了BatchedTooManyRowsAffectedException异常。我最终删除了连接的条目并将它们作为单独实体的一部分。

在您的情况下,我建议您再看一下 MyEmbeddable 地图的设置,特别是您设置连接列的部分。如果您的更新尝试删除多个条目(因此删除多行),这可能是问题的根源。

查看您定义的一些可用 XML 标记 - 您可能在某处需要类似一对多标记的东西。不幸的是,我在实体方面的经验使用 Spring/Hibernate 来绕过对显式 XML 文件的需求,因此我无法在这方面提供任何进一步的建议。

于 2013-02-14T17:48:25.503 回答