我連接彈簧服務(有問題的),下面的代碼:Spring + Hibernate的保存()不工作
@Async
public void performSeismicOperations(Integer sessionUserId,
int seismicFileId, String seismicFileName, ShClstr targetCluster,
Collection<String> listOperations, String processedFolderName,
Map<String, Object[]> args, String userNotes) throws IOException {
.
.
.
/*some code*/
.
.
Date currentDate = new Date(System.currentTimeMillis());
/*IMMEDIATE JOB ENTRY*/
log.info("Start : Inserting in sh_job to assure user");
ShJob shJob = new ShJob(user, ClusterConstants.JOB_SUBMITTED,
currentDate, null, null, null);
shJobDAO.save(shJob);
log.info("End : Inserting in sh_job to assure user");
/*some time-consuming operation - 1*/
SeismicFiles processedSeismicFile = new SeismicFiles(user,
processedFolderName, 0, HDFSConstants.PROCESSED, currentDate);
seismicFilesDAO.persist(processedSeismicFile);
/*some time-consuming operation - 2*/
log.info("Start : Updating the Hadoop job id");
shJob.setShjHadoopJobId(hadoopJobId);
shJobDAO.attachDirty(shJob);
log.info("End : Updating the Hadoop job id");
.
.
.
/*some code*/
.
.
log.info("Returning from SeismicHadoopServiceImpl.performSeismicOperations()");
}
DAO代碼
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.lnt.seismichadoop.pojo.ShJob;
@Repository
public class ShJobDAO {
private static final Log log = LogFactory.getLog(ShJobDAO.class);
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void persist(ShJob transientInstance) {
log.debug("persisting ShJob instance");
try {
sessionFactory.getCurrentSession().persist(transientInstance);
log.debug("persist successful");
} catch (RuntimeException re) {
log.error("persist failed", re);
throw re;
}
}
public void save(ShJob transientInstance) {
log.debug("SAVING ShJob instance");
try {
sessionFactory.getCurrentSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void attachDirty(ShJob instance) {
log.debug("attaching dirty ShJob instance");
try {
sessionFactory.getCurrentSession().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public void attachClean(ShJob instance) {
log.debug("attaching clean ShJob instance");
try {
sessionFactory.getCurrentSession().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public void delete(ShJob persistentInstance) {
log.debug("deleting ShJob instance");
try {
sessionFactory.getCurrentSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public ShJob merge(ShJob detachedInstance) {
log.debug("merging ShJob instance");
try {
ShJob result = (ShJob) sessionFactory.getCurrentSession().merge(
detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
public ShJob findById(java.lang.Integer id) {
log.debug("getting ShJob instance with id: " + id);
try {
ShJob instance = (ShJob) sessionFactory.getCurrentSession().get(
"com.lnt.seismic.dao.ShJob", id);
if (instance == null) {
log.debug("get successful, no instance found");
} else {
log.debug("get successful, instance found");
}
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
public List findByExample(ShJob instance) {
log.debug("finding ShJob instance by example");
try {
List results = sessionFactory.getCurrentSession()
.createCriteria("com.lnt.seismic.dao.ShJob")
.add(Example.create(instance)).list();
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
public List<ShJob> findAll() {
log.debug("finding JobStatus instance by findAll");
try {
Query query = sessionFactory.getCurrentSession().createQuery(
"from ShJob");
List<ShJob> results = query.list();
log.debug("find by findAll successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
}
我的要求是,一個項目必須去成作業表,一旦處理開始(/IMMEDIATE JOB ENTRY/中的代碼)。/一些耗時的操作完成後 - 2 /,我將更新同一條目(用適當的狀態)。 雖然我讀保存(之差),堅持(),我保存()仍然推遲插入,直到/ 一些費時的操作 - 2 /這反過來,反映了一個條目前端很晚。
請指引我到哪裏,我做一個大錯。
1日編輯
在我的情況下,用戶提交其涉及到標@Async上述服務方法的操作請求 - 用戶必須看到一個頁面,他的要求顯示「提交」,而運營方式仍在繼續。在這種情況下,我應該使用session.flush()還是需要進行任何代碼更改?
您是否嘗試在保存後刷新更改 –