2010-09-01 58 views
2

我有兩個表的數據庫模型:Session和ScriptExecution其間用一個一對多的關係有關:Spring/Hibernate:你需要在保存後加載實體才能使用它嗎?

public class ScriptExecution implements Serializable { 

@ManyToOne 
@PrimaryKeyJoinColumn 
private Session session; 

... 
} 

public class Session implements Serializable { 

@OneToMany(fetch=FetchType.EAGER, mappedBy="session") 
private Set<ScriptExecution> scriptExecutions; 

... 
} 

如果我創建一個會話,加載它,並把它分配給一個腳本執行一切正常精細:

Session session = new Session(); 
sessionDao.save(session); 

session = sessionDao.load(1); 

ScriptExecution scriptExecution = new ScriptExecution(); 
ScriptExecution.setSession(session); 
scriptExecutionDao.save(scriptExecution); 

如果我使用創建的會話直接將其如下分配給ScriptExecution:

Session session = new Session(); 
sessionDao.save(session); 

ScriptExecution scriptExecution = new ScriptExecution(); 
ScriptExecution.setSession(session); 
scriptExecutionDao.save(scriptExecution); 

Hibernate的失敗,出現以下錯誤:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into script_execution (end, session_id, start, id) values (?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

root cause 

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into script_execution (end, session_id, start, id) values (?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:637) 
org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793) 
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) 
com.sc2.web.controller.MainController.handleRequest(MainController.java:45) 
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

root cause 

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028) 
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366) 
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) 
com.sc2.web.controller.MainController.handleRequest(MainController.java:45) 
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

root cause 

java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`sc2`.`script_execution`, CONSTRAINT `fk_script_execution_session1` FOREIGN KEY (`session_id`) REFERENCES `session` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 
com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020) 
com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451) 
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028) 
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366) 
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) 
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) 
com.sc2.web.controller.MainController.handleRequest(MainController.java:45) 
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

我也試圖把代碼在一個事務中,但代碼失敗,出現同樣的錯誤。

TransactionTemplate template = new TransactionTemplate(transactionManager); 
template.execute(new TransactionCallbackWithoutResult() { 

    @Override 
    protected void doInTransactionWithoutResult(TransactionStatus arg0) { 
    Session session = new Session(); 
    sessionDao.save(session); 

    ScriptExecution scriptExecution = new ScriptExecution(); 
    scriptExecution.setSession(session); 
    scriptExecutionDao.save(scriptExecution); 

    } 
    }); 

你有什麼想法是怎麼回事?我不能相信我必須在創建它們之後加載創建的實體。

回答

2

我能夠解決這個問題: 在您的實體中表示ID的@Id註釋屬性,在數據庫模式中設置爲自動遞增的屬性必須使用@GeneratedValue進行註釋。

@Id 
@GeneratedValue 
private int id; 

而不是僅僅。

@Id 
private int id; 
+2

然後你應該接受你自己的回答 – 2010-09-01 08:46:24

+1

你應該知道這隻有在兩天內纔有可能。 – Erik 2010-09-01 08:48:18

相關問題