渲染图像时,是什么导致Hibernate执行update语句?

渲染图像时,是什么导致Hibernate执行update语句?,hibernate,grails,render,Hibernate,Grails,Render,我有一个控制器动作: def showFormImage() { def studyId = params.studyId def imageInstance = Image?.findByStudyIdAndSequence(studyId, params.sequence) byte[] image = imageInstance?.imageData render file: image, contentType: "image/jp

我有一个控制器动作:

def showFormImage() {
    def studyId = params.studyId
    def imageInstance = Image?.findByStudyIdAndSequence(studyId, params.sequence)

    byte[] image = imageInstance?.imageData
    render file: image,
           contentType: "image/jpeg"
}
我通过以下jQuery行调用该操作:

$('#imageToReview').attr('src', "/forms/imageManagement/showFormImage?studyId=" + data.studyId + "&sequence=1&timestamp=" + new Date());
我的堆栈跟踪中有以下错误:

Violation of PRIMARY KEY constraint ... Cannot insert duplicate key in object 'Forms.Image'.
Message: could not update: [...]; SQL [/* update ...Image */ update Forms.Image set DateUploaded=?, FileName=?, ImageData=?, Sequence=? where StudyID=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not update: [...Image#...]
我启用了SQL日志记录,并注意到正在向我的映像表发出更新请求:

Hibernate: 
/* update
    forms.Image */ update
        Forms.Image 
    set
        DateUploaded=?,
        FileName=?,
        ImageData=?,
        Sequence=? 
    where
        StudyID=?
是什么导致hibernate在我的映像表上执行更新请求?我很困惑。图像确实会被拉到我的网页中,所以我的代码工作正常。我还有另外两个类似的动作,它们从不同的表中提取图像。这些也可以正常工作,但是我没有在日志中看到这个错误。我似乎在网上找不到任何其他关于这个问题的参考资料

更新:

Image类的主键是composite。研究ID和序列

图像类需要更新以:

class Image implements Serializable {
    ...
    boolean equals(other) {
        if (!other instanceof Image) {
            return false
        }
        other.studyId ==studyId &&
        other.sequence == sequence
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
       builder.append studyId
       builder.append sequence
    }
    ...
    static mapping = {
    ...
    id    composite: [studyId, sequence]
    ...
 }

错误已经消失了。因此,我无法再发布完整的堆栈跟踪。但是,update语句仍然存在于SQL日志中。现在,这只是一个技术上的好奇问题。

再看一下这个问题,我想这是一个烟幕。获取此MS SQL错误的唯一方法是尝试插入主键值已在表中的行。所以更新不会导致错误。嗨,我已经从堆栈跟踪中添加了一点。正如您所看到的,错误肯定与update语句有关。图像表的主键是
日期上载
文件名
图像数据
序列
中的一个吗?如果是,则说明您有问题如果不是,则错误消息不是由更新引起的。不要添加“多一点”。添加完整的堆栈跟踪。另外,显示相关代码:实体和FindByStudyAndSequencemethod@defectus谢谢你让我走上正轨。我忘了我已经修改了这个表的主键。虽然我的日志中仍有更新,但没有错误。