我正在使用JPA的Hibernate实现.假设我有一个对象列表,我必须将其保存在一个名为Event的表中.所有这些对象都有相同的邮政编码.
public class Event {
String id;
String zipCode;
String locationCode;
String eventName;
String eventDesc;
}
这里id
是主键,zipCode
和locationCode
一起构成唯一键(UK_zipCode_locationCode).该表可能已经包含具有给定邮政编码的对象.因此,我所做的不是查找应该添加、删除或更新哪些对象,而是先删除表中具有给定邮政编码的所有对象,然后插入所有给定对象.
// getEventsToAdd method returns the list of events to be added for the zipCode 1234
// getEventsFromTheDB method returns all the events in the db with the zipCode 1234
List<Event> eventsToAdd = getEventsToAdd("1234");
List<Event> oldEvents = getEventsFromTheDB("1234");
for (Event e : oldEvents) {
entityManager.remove(e);
}
for (Event e : eventsToAdd) {
entityManager.persist(e);
}
entityManager.flush();
// ...
当oldEvents
列表为空时,或者当oldEvents
中的所有对象也在eventsToAdd
列表中时(我指的是具有相同id和相同邮政编码的事件对象).
然而,如果oldEvents
中的某些事件对象具有不同的id,即与eventsToAdd
列表中任何对象的id不匹配,则它会抛出异常
Duplicate Entry found for key UK_zipCode_locationCode
错误就好像没有从表中删除旧事件,现在插入具有相同zipCode和locationCode值的事件会导致org.hibernate.exception.ConstraintViolationException
.
然而,如果我在删除旧事件后调用entityManager.flush()
,它就会工作-
// This works!
for (Event e : oldEvents) {
entityManager.remove(customizedProviderAttribute);
}
// flush after removing all the old events
entityManager.flush();
for (Event e : eventsToAdd) {
entityManager.persist(e);
}
那么,为什么最后的冲洗不起作用,但在移除旧实体后的冲洗起作用呢?