标签: grails-orm

ORA-00972:标识符太长 - 在Grails中避免使用它的最佳策略

保存域类对象时,我收到"ORA-00972:标识符太长"错误.

Caused by: org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.intelligrape.model.Address.studentsForPermanentAddressId#79366215]
Run Code Online (Sandbox Code Playgroud)

除了减少studentsForPermanentAddressId字段的长度之外,可能有什么解决方案可以解决这个问题.原因是,这是一个我无法改变的遗留数据库表.

编辑:添加了Rob Hruska提出的域类描述

package com.intelligrape.model

class Address {

    String address1
    String address2
    String boxNumber
    String city
    Long stateLid
    String province
    String zipCode
    Long countryLid
    Double latitude
    Double longitude
    Long radius

    static hasMany = [studentsForPermanentAddressId: Student, studentsForLocalAddressId: Student]

static constraints = {
        address1 nullable: true
        address2 nullable: true
        boxNumber nullable: true, size: 1..25
        city nullable: true, size: 1..30
        stateLid nullable: true
        province nullable: true, size: 1..64
        zipCode nullable: true, size: 1..15 …
Run Code Online (Sandbox Code Playgroud)

oracle grails hibernate grails-orm

9
推荐指数
1
解决办法
9475
查看次数

跨两个数据源的Grails GORM域关联

belongsTo如果其他域类使用不同的数据源,是否可以在两个域类之间建立关联(即)?这两个数据源也是不同的数据库驱动程序.

我怀疑这可能是不可能的,但我想在这里与社区联系,看看是否有可能.现在我正在尝试这样做,我得到了通常怀疑的Hibernate错误:

Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table domain_class_A refers to an unmapped class: DomainClassB

样品:

class DomainClassA {
    static belongsTo = [dcB: DomainClassB]

    static mapping = {
        datasource "ds1"
        table name: "domain_class_A", schema: "schema_A"
    }
}

class DomainClassB {
    static hasMany = [dcA: DomainClassA]

    static mapping = {
        datasource "ds2"
        table name: "domain_class_B", schema: "schema_B"
    }
}
Run Code Online (Sandbox Code Playgroud)

grails datasource grails-orm relationship

9
推荐指数
1
解决办法
4204
查看次数

如何使用Liquibase删除Grails中的索引

我有一个由GORM(Grails Domain)生成的表.它具有生成随机字符的外键/索引,如FKAC7AAF67162A158F.我需要删除不再需要的字段.

问题,我有一些需要更新的服务器.所以我需要使用Liquibase创建一个迁移.但我不知道如果索引是随机名称(每个服务器我有不同的名称),如何删除该索引manualy.

是否可以在不知道其名称的情况下删除某个索引?

database migration grails grails-orm liquibase

8
推荐指数
2
解决办法
2万
查看次数

在grails域类中声明排序关联的最佳方法是什么?

似乎在Grails 中有两种不同的方式来声明已排序的关联:

方法1(请参阅此处)使用默认排序顺序

class Book {
  String title 
}
class Author {
  static hasMany = [books : Book]
  static mapping = { books sort: "title"}
}
Run Code Online (Sandbox Code Playgroud)

方法2(见这里)使用SortedSet

class Book implements Comparable {
  String title
  int compareTo(obj) {
    title <=> obj.title
  }
}
class Author {
  SortedSet books
  static hasMany = [books : Book]
}
Run Code Online (Sandbox Code Playgroud)

我不确定使用哪一个,有什么区别(如果有的话),使用一个与另一个之间的利弊.

我将不胜感激任何澄清.

谢谢

grails grails-orm grails-domain-class

8
推荐指数
1
解决办法
2868
查看次数

获取一对多加载对象的ID,而无需再使用GORM访问数据库

我必须使用与数据库表相关的GORM域,A和B. A与B具有一对多关系.因此,类看起来类似于:

class A {
   B b
   Long id
}

class B {
   Long id
}
Run Code Online (Sandbox Code Playgroud)

当我检索A的实例时,从数据库中检索相应B实例的ID.但是,当我尝试通过以下方式访问该ID时:

A a = A.get(11)
Long bid = a.b.id
Run Code Online (Sandbox Code Playgroud)

整个对象从数据库加载.在某些情况下,我只想要B的ID(已经检索过)并且不想从数据库加载整个实例.有没有办法从B获取ID而无需返回并获取整个对象.

注意:我知道它在a.b.id上面的行上进行了额外的提取,因为我可以看到自从我打开loggingSqlDataSource文件中的选项后生成的SQL .

grails groovy grails-orm

8
推荐指数
1
解决办法
1224
查看次数

grails - 告诉我有什么东西是脏的吗?

Grails提供了一个可以在域对象上调用的isDirty方法.如何修改Grails域模型系统,以便可以简单地调用方法,以查明是否有任何域对象是脏的.

我正在努力解决一些我未能确定的"未保存的瞬态实例"错误,并且知道什么是脏的很好.有一种优雅的方式来做这个与groovy?

grails groovy grails-orm

8
推荐指数
1
解决办法
4081
查看次数

grails中hasMany关系的选择性深度渲染

对于以下域模型:

class Route {
    String  name
    static  hasMany     = [checkPoints:CheckPoint]  
    static  belongsTo   = [someBigObject:SomeBigObject]


    static mapping = {
        checkPoints lazy: false
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要Route从Web服务返回一个特定的JSON.我希望这个JSON包含所有checkPoints但没有其他组合(即:) someBigObject.

如果我做

def route = Route.findById(id)
render route as JSON
Run Code Online (Sandbox Code Playgroud)

我得到的只是id的checkPoints,没有其他字段被提取:

{
    "class": "com.example.Route",
    "id": 1,
    "checkPoints": [
        {
            "class": "CheckPoint",
            "id": 1
        },
        {
            "class": "CheckPoint",
            "id": 2
        },
        {
            "class": "CheckPoint",
            "id": 4
        },
        {
            "class": "CheckPoint",
            "id": 3
        }
    ],
    "someBigObject": {
        "class": "SomeBigObject",
        "id": 2 …
Run Code Online (Sandbox Code Playgroud)

grails json grails-orm

8
推荐指数
1
解决办法
4626
查看次数

如何在Grails中进行简单的表连接

我对grails有点陌生,我在通过从这些表创建的域对象加入两个现有表时遇到了很多麻烦.有没有人知道如何在grails中这样做?以下是表格的外观以及我需要联接表格的示例.在此先感谢您的帮助.

Table1{ 

     field1table1 
} 

Table2{ 

     field1table2

     field2table2 
} 
Run Code Online (Sandbox Code Playgroud)

我需要加入这两个表,其中field1table1 = field1table2和结果表连接我需要看起来像这样:

JoinedTable{

     field1table1 

     field2table2 
}
Run Code Online (Sandbox Code Playgroud)

grails hibernate grails-orm

8
推荐指数
1
解决办法
5722
查看次数

为什么在Grails中更新时唯一约束字段失败

当我在域类中映射自定义标识属性时,为什么hibernate会检查唯一约束?当我更新对象时,尽管发布的字段值与存储在DB中的值相同,但验证失败!即使我没有对表单进行任何更改(确保dirty:false并且没有属性绑定错误),也会发生这种情况.我有一个Grails域类,如下所示:

class User {
  Long profileId
  String email
  String username
  String password
  String title
  String firstname
  String lastname
  String zipCode
  Date lastLoginDate

  static constraints = {
      profileId nullable: true, blank: true
      email blank: false, unique: true, email: true
      username blank: false, unique: true
      password blank: false
      lastLoginDate nullable: true

      firstname nullable: true
      lastname nullable: true
      zipCode nullable: true
  }

  static mapping = {
    table 'USER_PROFILE'
    id name:"profileId", column: "profile_id", generator: "sequence", params: [sequence:'userprofile_sequence']
    version false
  }

}
Run Code Online (Sandbox Code Playgroud)

现在,当我创建具有最小属性集的用户时,会创建一条记录.但是当我尝试更新相同的对象时:def user = …

validation grails hibernate spring-security grails-orm

8
推荐指数
1
解决办法
945
查看次数

Grails 3 @Delegate表示法,使用域对象

在Grails 2.4.4下,我们使用了用作域对象包装器的类.

它们看起来像这样:

class Foo {
  @Delegate
  OurDomainClass ourDomainClass
  ...

}
Run Code Online (Sandbox Code Playgroud)

这很有效,但是当尝试在Grails 3.0.11下编译时,我们得到了这个:

Foo.groovy:14:在非抽象类中不能有抽象方法.必须将类'Foo'声明为abstract或者必须实现方法'org.springframework.validation.Errors org_grails_datastore_gorm_GormValidateable__errors $ get()'.@第14行,第1列.coo Foo {^

删除@Delegate注释将使编译通过,但是对基础类的方法的调用显然不起作用.

有没有办法解决这个问题或实现相同的行为并让它通过Grails 3下的编译?

grails groovy grails-orm grails-3.0

8
推荐指数
1
解决办法
385
查看次数