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]
有人可以向我解释这个错误的原因是什么?我感谢您的帮助!谢谢!
答案 0 :(得分:0)
我认为您的问题是由于List path
为空而导致无法保存实体的。请尝试查看表格地图在数据库中的外观,您会发现它的列path
不可为空。
如果您向gorm hasMany
或hasOne
添加条目,那么您不需要为它们明确创建属性。如果您删除center
和path
,那么它应该开始工作:
MapCoordinate center //remove this
Integer zoom
List path //remove this
答案 1 :(得分:0)
我认为这里的问题是MapCoordinate
只有一个belongsTo
定义。另一方面,hasOne
中有hasMany
和Map
。我建议您将域类的结构更改为以下内容(包括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)