Java Spring JPA存储库中的两种事务处理方法

Java Spring JPA存储库中的两种事务处理方法,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,这是我的输出。它说我试图在数据库中保存一个具有相同beginPeriod的do12,但这是对它的唯一约束 显然,第一条hibernate消息表示他获得了do12记录,而第二条消息则表示他试图保存新报告 但是删除查询在哪里 休眠:选择。。。来自reports.do12 do12x0_uu其中 do12x0_ux0.beginPeriod= 休眠:插入到reports.do12 (beginPeriod,CountArea CancelTrain,countCancelTrain, countFul

这是我的输出。它说我试图在数据库中保存一个具有相同beginPeriod的do12,但这是对它的唯一约束

显然,第一条hibernate消息表示他获得了do12记录,而第二条消息则表示他试图保存新报告

但是删除查询在哪里

休眠:选择。。。来自reports.do12 do12x0_uu其中 do12x0_ux0.beginPeriod=

休眠:插入到reports.do12 (beginPeriod,CountArea CancelTrain,countCancelTrain, countFullCancelTrain,countTrainFollow,countTrainLate, countTrainOnGraph、countTrainOnSchedule、percentExecGraph、, 无其他原因的执行百分比、时间、报告期类型)值(?, ?,,,,,,,,,,,,,,,,,,,,,,?)

11:50:49546警告 http-bio-8080-exec-26 SqlExceptionHelper:logExceptions:144-SQL 错误:0,SQLState:23505

11:50:49547错误http-bio-8080-exec-26 SqlExceptionHelper:logExceptions:146-БББСА:Пччзчч “开始周期键” Паааач(开始阶段)=(2014-09-01)“жжжач”


首先,最好在脚本/消息中去掉俄语单词,让所有人都清楚地知道其中的含义。下一个问题是-您是否尝试跟踪deleteReport方法调用?您确定findReportByDate!=null返回“true”?是的,我返回了。Delete函数返回0,否则stacktrace中会出现一条关于错误的消息。关于stacktrace中的俄语,我描述了输出内容。delete的调用由if(findReportByDate!=null){}包装。findReportByDate不在其他任何地方使用-请检查此条件。为了明确起见,我会这样做,但如果我删除事务性注释,则一切正常。我检查了它,是(findReportByDate!=null)为true。
@Transactional(readOnly=false)
    public Do12 saveReport(Do12 report) {
        try {
// This is where I get a do12 record.
            Do12 findReportByDate = do12Repository.findByDate(report
                    .getBeginPeriod()); 
            if (findReportByDate != null) {
// This is where I delete the do12 record.
                if (deleteReport(findReportByDate) != 0) 
                    throw new Exception("Не удалось удалить запись о ДО12");
            }
            if (report.getCancelByService() != null)
                for (CancelByService cancelByService : report
                        .getCancelByService())
                    cancelByService.setReport(report);
            if (report.getLateByService() != null)
                for (LateByService lateByService : report.getLateByService())
                    lateByService.setReport(report);
// Here I save the new one and get an Exception.
            return do12Repository.save(report); 
        } catch (Exception e) {
            logger.error("", e);
            return null;
        }
    }

    public int deleteReport(Do12 report) {
        try {
            do12Repository.delete(report);
            return 0;
        } catch (Exception e) {
            logger.error("", e);
            return -1;
        }
}