话说最近写的东西都是个人遇到的小问题的笔记,是不是这行干的久了看的多了就不爱写什么理论长文了?
题归正传,其实是个很简单的小问题,就是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框架中的GORM(Groovy Object Relational Mapping)是利用Groovy语言的优势来简化数据库操作的一套对象关系映射技术。GORM支持多种查询方式,提供了类似于Hibernate的查询能力,并且由于Groovy语言的动态特性...
在本教程中,我们将探讨如何使用GORM(Grails Object-Relational Mapping)构建Spring Boot应用程序。GORM是Grails框架的核心部分,它为开发者提供了简单、强大的数据持久化功能,支持Hibernate和MongoDB等数据库。...
《Grails Datastore GORM Plugin Support 2.0.4.RELEASE:开源项目的代码生成与Android MVC模式解析》 在IT行业中,开发高效且可维护的软件系统是至关重要的。Grails Datastore GORM Plugin Support 2.0.4.RELEASE...
### Grails Persistence with GORM和GSQL:关键知识点解析 #### 标题解析:“Grails Persistence with GORM and GSQL” - **Grails**: 是一个基于Groovy的、开源的Web应用开发框架,它利用了Java平台的强大功能,...
《Grails 2 的终极指南》是一本深入探讨Grails框架精髓的专业书籍,该书以英文撰写,旨在为读者提供全面、深入的Grails框架学习资料。Grails框架基于Groovy语言,是一种高度动态、敏捷的Java应用开发框架,它简化了...
标题 "grails-datastore-gorm-tck-1.0.9.RELEASE.zip" 提供的信息表明,这是一个与Grails框架相关的数据存储(Datastore)和GORM(Grails Object Relational Mapping)测试兼容性工具包(Test Compatibility Kit,...
压缩包内的“one2many”可能是一个示例或教程,涉及到一对一(one-to-one)、一对多(one-to-many)或多对一(many-to-one)的关系映射。在数据库设计中,这些关系是常见的实体间关联。在Grails与GORM中,处理这种...
《The Definitive Guide to Grails 2》是Grails框架深入学习的重要参考资料,由业界专家撰写,旨在为开发者提供全面、详尽的Grails 2技术指导。这本书结合了理论与实践,不仅介绍了Grails的基本概念,还涵盖了高级...
今天遇到一个情况,GORM 根据 class 自动建表失败,且没有任何提示信息。 造成建表失败的原因是 varchar 类型字段的 maxSize*3 超过了 mysql varchar 字段最大字节数。 为什么要乘以3呢?因为 mysql 类型长度是按...
2. **GORM(Grails Object Relational Mapping)**: GORM 是Grails的ORM框架,提供了与数据库交互的能力,支持关系型数据库,如MySQL、PostgreSQL等。它提供了CRUD操作,以及事务管理和动态查询。 3. **插件系统**...
3. **GORM(Grails Object-Relational Mapping)**:Grails的内置ORM工具,允许开发者以声明式的方式操作数据库,支持SQL的CRUD操作,简化了数据持久化的过程。GORM支持多种数据库,如MySQL、PostgreSQL等。 4. **...
- **Relationships**:支持一对一、一对多、多对多等关系映射,例如belongsTo、hasMany、hasOne等。 - **Criteria API**:用于构建灵活的数据库查询,避免硬编码SQL。 5. **Ajax集成**: - **AJAX in Grails**:...
在IT行业中,GORM是一个非常重要的工具,尤其在Grails框架中,它是处理数据库操作的主要接口。本篇文章将深入探讨GORM的独立启动(Standalone)功能,这使得开发者可以在不依赖整个Grails应用的情况下使用GORM的强大...
GORM是Grails的持久化框架,它实现了Hibernate和ActiveRecord的功能,使得与数据库的交互变得简单。通过定义领域类,你可以轻松地完成CRUD(创建、读取、更新、删除)操作。 五、Grails插件系统 Grails的插件系统...
对象关系映射(GORM)是Grails框架中的一个重要组成部分,它为Groovy语言提供了对象持久化的支持。GORM支持基本的CRUD操作,并且在领域建模方面提供了强大的支持,包括一对一、一对多和多对多的关联。GORM支持继承,...
Grails 借鉴了Ruby on Rails的设计理念,引入了GORM(Grails Object Relational Mapping)用于数据库操作,以及一系列的插件系统,支持快速构建复杂的Web应用程序。 2. **Groovy语言基础** Grails 采用Groovy作为...