我是新来的冬眠,试图更好地理解它。我一直在尝试将数据提取到数据库中,并且在Track Table上,track_uuid上存在唯一约束。
我试图只保存并捕获异常,然后继续进行下一个插入操作,但是我开始使用最多的连接。
因此,我开始四处张望,发现一个会话具有功能saveOrUpdate。
http://www.javabeat.net/difference-between-hibernates-saveupdate-and-saveorupdate-methods/
但是,当我将保存更改为saveOrUpdate时,我继续收到一条错误消息,指出重复的键值违反了唯一约束“ track_track_uuid_key”。
我的代码:
/**
* @param p_track the track to parse
* @param p_dbTrackMessage the database track message
* @param p_session the database session
* @return {@link database.model.Track} Returns the ingested database track
* @throws Exception error
*/
private static database.model.Track parseTrack(final Track p_track,
final database.model.TrackMessage p_dbTrackMessage,
final Session p_session) throws Exception {
// the db track model
final database.model.Track dbTrack = new database.model.Track();
// get and set track uuid
dbTrack.setTrackUuid(p_track.getTrackUUID());
// get and set track number
dbTrack.setTrackNumber(p_track.getTrackNumber());
// get and set the track excerise indicator
dbTrack.setTrackExerciseIndicator(EnumDatabaseLoader.loadByName(
TrackExerciseIndicator.class, p_track.getExerciseIndicator().name(), p_session));
// get and set track simulation indicator
dbTrack.setTrackSimulationIndicator(EnumDatabaseLoader.loadByName(
TrackSimulationIndicator.class, p_track.getSimulationIndicator().name(), p_session));
// get and set the track status
final TrackStatus trackStatus = p_track.getTrackStatus();
if (trackStatus != null) {
dbTrack.setTrackStatus(EnumDatabaseLoader.loadByName(
database.model.TrackStatus.class, trackStatus.name(),
p_session));
}
try {
p_session.getTransaction().begin();
// save the track
p_session.save(dbTrack); // Error happens here I've attempted to change this to saveOrUpdate getting same error.
// create the mapping
final TrackMessageToTrackMapping trackMessageToTrackMapping =
new TrackMessageToTrackMapping();
trackMessageToTrackMapping.setTrackMessage(p_dbTrackMessage);
trackMessageToTrackMapping.setTrack(dbTrack);
// save the mapping
p_session.save(trackMessageToTrackMapping);
p_session.getTransaction().commit();
}
catch (Exception exception) {
exception.printStackTrace();
p_session.getTransaction().rollback();
throw exception;
}
// return the track
return dbTrack;
}
所以我的问题是,为什么saveOrUpdate无法识别该记录已经存在并尝试更新它,而不是返回记录,而记录已经存在,并且在1列上具有匹配的唯一约束。
旁注,如果数据库中没有数据,它可以加载所有内容,则可以正常工作。
最佳答案
saveOrUpdate
仅关于主键,而不是任意的唯一约束。为了确定它是save
还是update
,Hibernate根本不查询数据库:它只是检查是否在所考虑的对象上设置了主键属性。
不幸的是,要使Hibernate生成适当的语句(在违反唯一约束时不会失败)将非常困难。您无法直接控制生成的SQL,并且语法高度依赖于数据库。