话说最近写的东西都是个人遇到的小问题的笔记,是不是这行干的久了看的多了就不爱写什么理论长文了?
题归正传,其实是个很简单的小问题,就是one to many的时候,如果one一端指明了,many为List类型,则many端会多一个 字段名_idx的字段,值是0,1,2,...如果你只是把many端的外键设置为null,剩下的idx从1,2,3...这样排序,会导致one加载的时候产生一个null,很诡异是吧...话说不知道为什么以前用hibernate的时候从来没有遇到过这个情况。
下面是具体例子。
User类是Many
import groovy.transform.EqualsAndHashCode; @EqualsAndHashCode class User { String name Company company static belongsTo = [company: Company] static constraints = { company nullable:true } }
Comany是One,不过不一定严格关联,User可能属于一个Company,也可能不属于,那就是null。
import groovy.transform.EqualsAndHashCode; @EqualsAndHashCode class Company { String name List<User> users static hasMany = [users:User] static mapping = { users cascade:'none' } }
现在我插入几条测试数据
new Company(name:'Company1').save() new Company(name:'Company2').save() new User(name:'User1').save() new User(name:'User2').save() new User(name:'User3').save() Company company1 = Company.get(1) company1.addToUsers(User.get(1)) company1.addToUsers(User.get(2))
下面我要做的是取消user.get(1)和Company的关联。
于是我在controller里写了如下代码:
def deleteUser(Long id) { def u = User.get(id) u.company = null boolean r = u.save(flush:true) if (!r) { println "saved ok" } else { println "not ok" println u.errors } }
然后发现不好用,company无法被设置为null,不得已只能改为
def deleteUser(Long id) { def u = User.get(id) u.company = null boolean r = u.save(flush:true) if (!r) { println "saved ok" } else { println "not ok" println u.errors } int row = User.executeUpdate("update User set company = null where id = ?", [id]) println "row count:${row}" }
结果发现这样是好用了,设置为null了,但是再次加载Company.get(1),然后对users进行循环的时候,发生空指针异常。
仔细看了一下sql发现就是因为List类型会检查users_idx字段,然后按值放到List的index里面,0没有了,只能null。
解决办法是如果需要排序,自己实现Comparable,去掉List<User>这个声明。---当然实际这个问题折腾了我半天时间,因为many那个表字段太多了,根本没发现问题出在哪里,最后做了这么个小例子才看清楚。
不过真的很奇怪为什么之前用了那么久hibernate,一直没遇到过这种场景?
相关推荐
简单介绍grails的查询操作,已经类似与hibnatate的查询方式
使用GORM构建Spring Boot应用程序 Grails指南_ Grails框架.pdf
Grails Persistence with GORM and GSQL
今天遇到一个情况,GORM 根据 class 自动建表失败,且没有任何提示信息。 造成建表失败的原因是 varchar 类型字段的 maxSize*3 超过了 mysql varchar 字段最大字节数。 为什么要乘以3呢?因为 mysql 类型长度是按...
详细介绍grails框架的奥秘,英文版你值得拥有
prestige.zip,android的mvc模式,android的代码生成驱动的mvc模式。
Grails Grails Grails Grails Grails
Beginning Groovy and Grails From Novice to Professional Christopher M. Judd, Joseph Faisal Nusairat, James Shingler
The definitive guide to grails 2 英文版 书和随书代码, 学习grails必备
mobile-detect.zip,用于检测移动设备的轻量级Java库。用于检测移动设备的轻量级Java库。
Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南
First-time developers are amazed at how quickly you can get a page-centric MVC web site up and running thanks to the scaffolding and convention over configuration that Grails provides. Advanced web ...
GORM(Grails对象映射) [Grails] [Grails]是用于使用[Groovy] [Groovy]编程语言构建Web应用程序的框架。 该项目为Hibernate和NoSQL数据存储上的GORM的新实现提供了GORM API管道。 [Grails]: : [Groovy]: : ...
4.1 简化的orm和grails对象关系映射(gorm) 4.2 gorm基础 4.3 设置属性可选 4.4 gorm中的关系 4.5 执行crud操作 4.5.1 创建书签 4.5.2 读取书签 4.5.3 更新书签 4.5.4 ...
Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。
Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程
Grails1.1中文文档