grails数据完整性违规异常和原因?

时间:2016-11-02 06:02:44

标签: hibernate grails gorm

Map的定义是

class Map {

    MapCoordinate center
    Integer zoom
    List path

    static hasMany = [path: MapCoordinate]

    static hasOne = [center: MapCoordinate]

    static constraints = {

    }
}

MapCoordinate的定义是

class MapCoordinate {

    BigDecimal latitude
    BigDecimal longitude


    static belongsTo = [map: Map]

    static mapping = {

        latitude scale: 9
        longitude scale: 9

    }

    static constraints = {
    }
}

这个简单的脚本失败,出现以下异常

Map map = new Map()

def cent = new MapCoordinate(latitude: 0.123, longitude: 0.2424)

map.center = cent

map.zoom = 5

map.save(flush:true, failOnError: true)

异常

org.springframework.dao.DataIntegrityViolationException: could not insert: [MapCoordinate]; SQL [insert into map_coordinate (version, latitude, longitude, map_id, path_idx) values (?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [MapCoordinate]

有人可以向我解释这个错误的原因是什么?我感谢您的帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您的问题是由于List path为空而导致无法保存实体的。请尝试查看表格地图在数据库中的外观,您会发现它的列path不可为空。

如果您向gorm hasManyhasOne添加条目,那么您不需要为它们明确创建属性。如果您删除centerpath,那么它应该开始工作:

MapCoordinate center //remove this
Integer zoom
List path //remove this

答案 1 :(得分:0)

我认为这里的问题是MapCoordinate只有一个belongsTo定义。另一方面,hasOne中有hasManyMap。我建议您将域类的结构更改为以下内容(包括Randall的建议)。使用mappedBy,您可以确保grails能够正确识别这两种关系。

class Map {
    Integer zoom
    SortedSet path
    static hasMany = [path: MapCoordinate]
    MapCoordinate center

    static mappedBy = [path: "mapPath", center: "mapCenter"]

    static constraints = {
        center nullable: true
    }
}

class MapCoordinate implements Comparable {
    BigDecimal latitude
    BigDecimal longitude

    static belongsTo = [mapPath: Map, mapCenter: Map]

    static mapping = {
        latitude scale: 9
        longitude scale: 9
    }
    static constraints = {
        mapPath nullable: true
        mapCenter nullable: true
    }

    int compareTo(other) {
        if (id) {
            id.compareTo(other.id)
        }
        else {
            return -1
        }
    }

}

通过添加SortedSet,您应该能够保留MapCoordinate条目的顺序。但是,MapCoordinate类必须实现Comparable接口。最后,尝试按如下方式更改代码:

Map map = new Map()
def cent = new MapCoordinate(latitude: 0.123, longitude: 0.2424)
map.center = cent
map.zoom = 5
map.addToPath(new MapCoordinate(latitude: 0.33, longitude: 0.33))
map.addToPath(new MapCoordinate(latitude: 0.34, longitude: 0.34))
map.save(flush: true, failOnError: true)