我正在尝试使用 Hibernate 的 delete 方法删除对象,但得到 StaleStateException 异常。我的要求是根据唯一键删除一个对象,所以为此我正在做类似的事情。
String queryString="from Destination destination "+
"where destination.destinationID = :destinationid";
tx.begin();
Query query= session.createQuery(queryString).setParameter("destinationid", destinationId, Hibernate.STRING);
@SuppressWarnings("unchecked")
List<Destination> list=query.list();
Destination ds=list.get(0);
if(!list.isEmpty())
session.evict(ds);
session.delete(ds);
tx.commit();
因为我知道列表中只有一个元素如果它不为空,所以只从列表中获取第一个元素(不确定这是否是一个好方法)
但是当我运行此方法时,我可以在控制台中看到以下 sql 日志
Hibernate:
/* delete collection AirTransport.timeTable */ delete
from
tr.TRANSPORTTIME
where
TRANSPORTID=?
Hibernate:
/* delete collection AirTransport.timeTable */ delete
from
tr.TRANSPORTTIME
where
TRANSPORTID=?
Hibernate:
/* delete collection AirTransport.timeTable */ delete
from
tr.TRANSPORTTIME
where
TRANSPORTID=?
Hibernate:
/* delete collection RoadTransport.timeTable */ delete
from
tr.TRANSPORTTIME
where
TRANSPORTID=?
Hibernate:
/* delete collection TrainTransport.timeTable */ delete
from
tr.TRANSPORTTIME
where
TRANSPORTID=?
Hibernate:
/* delete AirTransport */ delete
from
tr.TRANSPORT
where
UUID=?
Hibernate:
/* delete AirTransport */ delete
from
tr.TRANSPORT
where
UUID=?
Hibernate:
/* delete AirTransport */ delete
from
tr.TRANSPORT
where
UUID=?
Hibernate:
/* delete RoadTransport */ delete
from
tr.TRANSPORT
where
UUID=?
而不是它的投掷
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:61)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
让我怀疑的一件事是,在我的运输表中,我有三个条目,只有一个用于 AirTransport,一个用于火车,最后一个用于公路,在 TransPortTime 表中,我有三个条目,每个运输类型和
我在所有三个传输类中都使用 TransportTime 作为复合元素
<set name="timeTable" table="TRANSPORTTIME" lazy="true">
<key column="TRANSPORTID"/>
<composite-element
class="TransportTime">
<property name="deperatureTime" type="java.util.Date">
<column name="DEPERATURETIME" />
</property>
<property name="arrivalTime" type="java.util.Date">
<column name="ARRIVALTIME" />
</property>
<other properties>
</composite-element>
</set>
我仍然无法弄清楚出了什么问题,所以尽管在社区中询问
只是为了添加一些额外的信息:我的目标类中有以下三个对应的 trabsport 类的映射
<set name="airTransport" table="AIRTRANSPORT" inverse="true" lazy="true" cascade="save-update, delete">
<key>
<column name="DESTINATIONID" />
</key>
<one-to-many class="AirTransport" />
</set>
<set name="roadTransport" table="ROADTRANSPORT" inverse="true" lazy="true" cascade="save-update, delete">
<key>
<column name="DESTINATIONID" />
</key>
<one-to-many class="RoadTransport" />
</set>
<set name="trainTransport" table="TRAINTRANSPORT" inverse="true" lazy="true" cascade="save-update, delete">
<key>
<column name="DESTINATIONID" />
</key>
<one-to-many class="TrainTransport" />
</set>
在我的 RoadTransport/Train/Air Transport 中有以下映射
<class name="AirTransport" table="TRANSPORT">
<id name="uuid" type="java.lang.String">
<column name="UUID" />
<generator class="uuid"/>
</id>
<many-to-one name="destination" class="Destination" fetch="join">
<column name="DESTINATIONID" />
</many-to-one>
<property mappings>
<set name="timeTable" table="TRANSPORTTIME" lazy="true">
<key column="TRANSPORTID"/>
<composite-element
class="TransportTime">
<property mappings>
</composite-element>
</set>
</class>
其他两个映射文件也相同,因此当我从父类中删除这三个类的映射关联时,我的删除功能开始完美运行。
所以这意味着我在将 TimeTable 类映射为 Transport 类(Air/Train/Road Transport 类)中的组件时做错了
在这方面的任何建议都会很有帮助