Playframework tomcat上的Play框架+;lighttpd-jpa

Playframework tomcat上的Play框架+;lighttpd-jpa,playframework,Playframework,你能告诉我这里出了什么问题吗。这就是我在控制器类中的方法的样子 public static void save(Long jobId, Long posetByUserId) throws Exception { try{ java.util.Date date = new java.util.Date(); SavedJob job = SavedJob.findByUserIdJobId(connectedUserID(), jobId);

你能告诉我这里出了什么问题吗。这就是我在控制器类中的方法的样子

public static void save(Long jobId, Long posetByUserId)  throws Exception
{
    try{ 
        java.util.Date date = new java.util.Date();  
        SavedJob job = SavedJob.findByUserIdJobId(connectedUserID(), jobId);  //place 1
        String validationText = null;

        if(job != null){          //place 2
            validationText = play.i18n.Messages.get("saved.already");
            renderJSON(validationText);
        }else{

            SavedJob saveJob = new SavedJob();
            saveJob.userID = connectedUserID();
            saveJob.jobId = jobId;
            saveJob.insertDate = date;
            saveJob.updateDate = date;
            saveJob.posetByUserId = posetByUserId;
            saveJob.message = play.i18n.Messages.get("save.saved");

            UserProfile userProfile = connectedUser();
            userProfile.arlSavedJobs.add(saveJob);
            UserProfile.saveUser(userProfile);
                    .....
            }
.......
}
我使用AJAX调用上述方法

案例1 当我在开发模式下运行play(而不是tomcat)并将线程池指定为1时,一切都很好

案例2 我将其部署到tomcat+lighttpd。上述方法失败

如果我调用上述方法两次,第一个请求似乎位于上面的“位置1”,而第二个请求到达“位置2”,并给出一个错误“saved.ready”。请求未序列化

我确信我在这里做错了什么,但请你提出建议。我需要两个请求来保存这两个项目

谢谢你的帮助

我仍在尝试进一步调试。抱歉,如果我误导了你,问题似乎在于hibernate试图进行插入而不是更新

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 

hibernate tries to fire an insert for an already saved entiry instead of an update
下面的案例2:我发送了两个请求。 请求1被保存下来,现在我在userProfile.arlSavedJobs.add(saveJob)中有一个对象; 请求2来了,所以应该导致1次插入和1次更新,但我可以看到hibernate尝试触发两次插入,并给出了唯一的约束异常。有什么想法吗

请注意UserProfile.saveUser(UserProfile);对userprofile执行合并。合并后,它会为已保存的实体调用插入而不是更新


非常感谢。 经过调查,这就是我所处的位置:当第一个请求出现时,它将对象添加到列表中的以下位置:userProfile.arlSavedJobs.add(saveJob);保存可以很好地工作。当第二个请求出现时,此列表“arlSavedJobs”已经有一个对象,第二个请求向同一列表中添加了一个以上的对象。 当它到达inle“UserProfile.saveUser(UserProfile);”并试图保存它时,它应该为新对象触发一个insert,为已经存在的对象触发一个update(由请求1添加)。但是,它为这两个对象触发2次插入,并提供唯一的约束异常。堆栈轨迹如下所示:

[2012-02-23 23:37:39914]调试21530[http-8080-3]-org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111)-插入已保存的_作业(删除_标志,插入_日期,由用户发布_ID,更新_日期,作业ID,用户ID)值(?,,,,,,?) [2012-02-23 23:37:39967]调试21583[http-8080-3]-org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111)-插入已保存的_作业(删除_标志,插入_日期,由用户发布_ID,更新_日期,作业ID,用户ID)值(?,,,,,?) [2012-02-23 23:37:40019]错误21635[http-8080-3]-org.hibernate.util.jdbceptionreporter.logExceptions(jdbceptionreporter.java:234)-密钥“PRIMARY”的重复条目“4-1” [2012-02-23 23:37:40075]错误21691[http-8080-3]-org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348)-无法将数据库状态与会话同步 org.hibernate.exception.ConstraintViolationException:无法执行JDBC批更新 位于org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:96) 位于org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66) 位于org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 位于org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268) 位于org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) 位于org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:345) 位于org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 位于org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 位于org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795) 在play.db.jpa.JPABase._save(JPABase.java:47) at play.db.jpa.GenericModel.save(GenericModel.java:184) 位于models.UserProfile.saveUser(UserProfile.java:401) at controllers.JTLeadsController.saveLead(JTLeadsController.java:202) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中 位于java.lang.reflect.Method.invoke(Method.java:597) atplay.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:546) atplay.mvc.ActionInvoker.invoke(ActionInvoker.java:500) atplay.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476) atplay.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471) atplay.mvc.ActionInvoker.invoke(ActionInvoker.java:159) atplay.server.ServletWrapper$ServletInvocation.execute(ServletWrapper.java:540) Invoker$Invocation.run(Invoker.java:265) at play.server.ServletWrapper$ServletInvocation.run(ServletWrapper.java:531) Invoker.invokeInThread(Invoker.java:67) at play.server.ServletWrapper.service(ServletWrapper.java:130) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)