保存域类对象时,我收到"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) 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) 我有一个由GORM(Grails Domain)生成的表.它具有生成随机字符的外键/索引,如FKAC7AAF67162A158F.我需要删除不再需要的字段.
问题,我有一些需要更新的服务器.所以我需要使用Liquibase创建一个迁移.但我不知道如果索引是随机名称(每个服务器我有不同的名称),如何删除该索引manualy.
是否可以在不知道其名称的情况下删除某个索引?
似乎在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)
我不确定使用哪一个,有什么区别(如果有的话),使用一个与另一个之间的利弊.
我将不胜感激任何澄清.
谢谢
我必须使用与数据库表相关的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提供了一个可以在域对象上调用的isDirty方法.如何修改Grails域模型系统,以便可以简单地调用方法,以查明是否有任何域对象是脏的.
我正在努力解决一些我未能确定的"未保存的瞬态实例"错误,并且知道什么是脏的很好.有一种优雅的方式来做这个与groovy?
对于以下域模型:
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有点陌生,我在通过从这些表创建的域对象加入两个现有表时遇到了很多麻烦.有没有人知道如何在grails中这样做?以下是表格的外观以及我需要联接表格的示例.在此先感谢您的帮助.
Table1{
field1table1
}
Table2{
field1table2
field2table2
}
Run Code Online (Sandbox Code Playgroud)
我需要加入这两个表,其中field1table1 = field1table2和结果表连接我需要看起来像这样:
JoinedTable{
field1table1
field2table2
}
Run Code Online (Sandbox Code Playgroud) 当我在域类中映射自定义标识属性时,为什么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 = …
在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 ×10
grails-orm ×10
groovy ×3
hibernate ×3
database ×1
datasource ×1
grails-3.0 ×1
json ×1
liquibase ×1
migration ×1
oracle ×1
relationship ×1
validation ×1