2010-09-01 7 views
2

J'ai un modèle de base de données avec deux tables: Session et ScriptExecution qui sont associés à un-à-plusieurs:Spring/Hibernate: devez-vous charger des entités pour les utiliser après l'enregistrement?

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; 

... 
} 

Si je crée une session, la charge et l'affecter à une exécution de script tout fonctionne fin:

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

session = sessionDao.load(1); 

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

Si j'utilise la session créée directement à l'attribuer à la ScriptExecution comme suit:

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

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

Mise en veille prolongée échoue avec l'erreur suivante:

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) 

J'ai également essayé de mettre le code dans une transaction, mais le code échoue avec la même erreur.

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); 

    } 
    }); 

Avez-vous une idée de ce qui est insuffisant? Je ne peux pas croire que je dois charger des entités créées après les avoir créées.

Répondre

2

j'ai pu résoudre le problème: Les propriétés @Id annotée qui représentent les id dans vos entités et sont mis à incrémentation automatique dans votre schéma de bases de données doivent être annotée avec @GeneratedValue aussi, par exemple

@Id 
@GeneratedValue 
private int id; 

au lieu de seulement.

@Id 
private int id; 
+2

Ensuite, vous devez accepter votre propre réponse –

+1

Vous devez savoir que cela est seulement possible en deux jours. – Erik