我正在尝试通过将Hibernate映射到MySQL表来实现一些Java对象的持久性。当我提交时,会收到一条消息,显示“批处理更新返回了意外的行计数 [0]; 实际行计数:0; 预期:1”。
我的假设是,在我的Java POJO中有一个long字段,我想将其用作MySQL表中的主键,这可能导致问题。由于我无法在MySQL表中使用LONG数据类型作为主键(错误1170:BLOB/TEXT列'id'在没有键长度的键规范中使用),因此我从一些搜索和这个post中得出结论,BIGINT将是适合
我的测试POJO
我在xml中进行hibernate映射(person.hbm.xml),基本上看起来像(减去标题):
我的假设是,在我的Java POJO中有一个long字段,我想将其用作MySQL表中的主键,这可能导致问题。由于我无法在MySQL表中使用LONG数据类型作为主键(错误1170:BLOB/TEXT列'id'在没有键长度的键规范中使用),因此我从一些搜索和这个post中得出结论,BIGINT将是适合
long
的映射。然而它没有更新。我的测试POJO
Person
非常简单。它有3个字段:id(long)、firstname(String)、lastname(String)以及setter和getter等。我在xml中进行hibernate映射(person.hbm.xml),基本上看起来像(减去标题):
<hibernate-mapping>
<class name="hibernatetest.Person" table="hibernatetest">
<id name="id" type="long" column="id" >
<generator class="native"/>
</id>
<property name="firstname">
<column name="firstname" />
</property>
<property name="lastname">
<column name="lastname"/>
</property>
</class>
</hibernate-mapping>
我实际的Java代码片段,旨在保存或更新记录,非常简单:
Transaction tr = session.beginTransaction();
Person person = new Person(1,"John","Doe");
session.saveOrUpdate(person);
tr.commit();
这里是问题,如果我将Person对象和MySQL表中的id
类型更改为int(Integer),那么一切都可以正常工作。但是,我无法对要持久化的实际对象进行此更改,所以问题是:我做错了什么或者我应该怎么做才能使其正常工作?谢谢。
添加堆栈跟踪:
Hibernate: update hibernatetest set firstname=?, lastname=? where id=?
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
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.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3006)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2908)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3237)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:113)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:273)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:265)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:187)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1082)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:317)
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.hibernate.test.TestMain.main(TestMain.java:38)
nested transactions not supported
更新: 好的,我终于解决了。我将Hibernate生成器类从“native”更改为“assigned”,现在它按预期工作。因此,现在Hibernate映射如下:
<hibernate-mapping>
<class name="hibernatetest.Person" table="hibernatetest">
<id name="id" type="long" column="id" >
<generator class="assigned"/>
</id>
<property name="firstname">
<column name="firstname" />
</property>
<property name="lastname">
<column name="lastname"/>
</property>
</class>
</hibernate-mapping>
我必须承认我不知道那个参数的意义(从某处复制),也不知道它会引起这么多的头疼。发现了这个解释,非常有用。
显然我没有足够的凭据来回答自己的问题,所以我想它将保持开放状态,或者如果有人提供一个空答案,我将接受它。谢谢。