`
flashing
  • 浏览: 355187 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Grails gorm的one to many空指针问题

 
阅读更多

话说最近写的东西都是个人遇到的小问题的笔记,是不是这行干的久了看的多了就不爱写什么理论长文了?

题归正传,其实是个很简单的小问题,就是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查询.pdf

    Grails框架中的GORM(Groovy Object Relational Mapping)是利用Groovy语言的优势来简化数据库操作的一套对象关系映射技术。GORM支持多种查询方式,提供了类似于Hibernate的查询能力,并且由于Groovy语言的动态特性...

    使用GORM构建Spring Boot应用程序 Grails指南_ Grails框架.pdf

    在本教程中,我们将探讨如何使用GORM(Grails Object-Relational Mapping)构建Spring Boot应用程序。GORM是Grails框架的核心部分,它为开发者提供了简单、强大的数据持久化功能,支持Hibernate和MongoDB等数据库。...

    grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip

    《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 and GSQL

    ### Grails Persistence with GORM和GSQL:关键知识点解析 #### 标题解析:“Grails Persistence with GORM and GSQL” - **Grails**: 是一个基于Groovy的、开源的Web应用开发框架,它利用了Java平台的强大功能,...

    the definitive guide to grails 2

    《Grails 2 的终极指南》是一本深入探讨Grails框架精髓的专业书籍,该书以英文撰写,旨在为读者提供全面、深入的Grails框架学习资料。Grails框架基于Groovy语言,是一种高度动态、敏捷的Java应用开发框架,它简化了...

    grails-datastore-gorm-tck-1.0.9.RELEASE.zip

    标题 "grails-datastore-gorm-tck-1.0.9.RELEASE.zip" 提供的信息表明,这是一个与Grails框架相关的数据存储(Datastore)和GORM(Grails Object Relational Mapping)测试兼容性工具包(Test Compatibility Kit,...

    grails使用freemarker.rar

    压缩包内的“one2many”可能是一个示例或教程,涉及到一对一(one-to-one)、一对多(one-to-many)或多对一(many-to-one)的关系映射。在数据库设计中,这些关系是常见的实体间关联。在Grails与GORM中,处理这种...

    The definitive guide to grails 2 英文版 书 代码

    《The Definitive Guide to Grails 2》是Grails框架深入学习的重要参考资料,由业界专家撰写,旨在为开发者提供全面、详尽的Grails 2技术指导。这本书结合了理论与实践,不仅介绍了Grails的基本概念,还涵盖了高级...

    Grails GORM 自动建表失败,且无错误提示信息

    今天遇到一个情况,GORM 根据 class 自动建表失败,且没有任何提示信息。 造成建表失败的原因是 varchar 类型字段的 maxSize*3 超过了 mysql varchar 字段最大字节数。 为什么要乘以3呢?因为 mysql 类型长度是按...

    Grails Grails Grails

    2. **GORM(Grails Object Relational Mapping)**: GORM 是Grails的ORM框架,提供了与数据库交互的能力,支持关系型数据库,如MySQL、PostgreSQL等。它提供了CRUD操作,以及事务管理和动态查询。 3. **插件系统**...

    Grails权威指南 Grails权威指南

    3. **GORM(Grails Object-Relational Mapping)**:Grails的内置ORM工具,允许开发者以声明式的方式操作数据库,支持SQL的CRUD操作,简化了数据持久化的过程。GORM支持多种数据库,如MySQL、PostgreSQL等。 4. **...

    Grails权威指南.pdf

    - **Relationships**:支持一对一、一对多、多对多等关系映射,例如belongsTo、hasMany、hasOne等。 - **Criteria API**:用于构建灵活的数据库查询,避免硬编码SQL。 5. **Ajax集成**: - **AJAX in Grails**:...

    GORM的独立启动(Standalone)

    在IT行业中,GORM是一个非常重要的工具,尤其在Grails框架中,它是处理数据库操作的主要接口。本篇文章将深入探讨GORM的独立启动(Standalone)功能,这使得开发者可以在不依赖整个Grails应用的情况下使用GORM的强大...

    grails-用户手册

    GORM是Grails的持久化框架,它实现了Hibernate和ActiveRecord的功能,使得与数据库的交互变得简单。通过定义领域类,你可以轻松地完成CRUD(创建、读取、更新、删除)操作。 五、Grails插件系统 Grails的插件系统...

    grails中文入门简介

    对象关系映射(GORM)是Grails框架中的一个重要组成部分,它为Groovy语言提供了对象持久化的支持。GORM支持基本的CRUD操作,并且在领域建模方面提供了强大的支持,包括一对一、一对多和多对多的关联。GORM支持继承,...

    grails-2.4.4.zip

    Grails 借鉴了Ruby on Rails的设计理念,引入了GORM(Grails Object Relational Mapping)用于数据库操作,以及一系列的插件系统,支持快速构建复杂的Web应用程序。 2. **Groovy语言基础** Grails 采用Groovy作为...

Global site tag (gtag.js) - Google Analytics