在grails中,我可以实现这样的N:1关系:
class Parent { hasMany = [children:Child] }
class Child { belongsTo = [parent:Parent] }
Run Code Online (Sandbox Code Playgroud)
现在(如果总是正确使用addTo和removeFrom)我可以通过parent.children获取Parent的子项.
但我也可以在没有hasMany的情况下做到这一点:
class Parent { }
class Child { belongsTo = [parent:Parent] }
Run Code Online (Sandbox Code Playgroud)
然后我必须使用Child.findAllByParent(parent)来获取所有孩子.
我的问题:如果能以第二种方式查询父母的孩子,我有什么理由可以使用hasMany吗?
我想它有时更容易(也许更快,如果与父母一起渴望获取?)只是引用parent.children,但另一方面,当有几个孩子时,这个List会变得相当长.而我不喜欢的事情还有很多,你总是需要注意addTo或removeFrom,或者在添加一个带有Parent的新Child之后清除会话,以便grails自动执行此操作...
答案是你应该简单地使用hasMany如果有很少的孩子并且如果有很多孩子而不使用它(出于性能原因),或者还有更多的孩子?
关注grails域类:
class MyClass {
Map myMap
}
Run Code Online (Sandbox Code Playgroud)
现在,对于myMap,grails会自动为地图中的元素创建一个新表.但是,如果我添加太长的元素(例如1024个字符),我会收到DB错误.
我可以以某种方式告诉grails使myMap表中的相应列足够大以允许更大的字符串,或者我是否必须在数据库中手动执行此操作?
我已经试过了
static constraints = {
myMap(maxSize:1024)
}
Run Code Online (Sandbox Code Playgroud)
哪个不起作用(正如预期的那样,因为maxSize应该引用Map的值而不是Map本身).
如果不是通过约束,也许有办法通过约束
static mapping { ... }
Run Code Online (Sandbox Code Playgroud)
?
database mapping grails hibernate-mapping grails-domain-class
现在我有字段"String firstName"它转换为"first_name",我希望"firstname"作为Hibernate的默认值.它可以吗?
我正在使用Grails Webflow插件.以下是我正在使用的域对象:
class Foo implements Serializable {
String fooProp1,
fooProp2
static constraints = {
fooProp2 nullable: false
}
}
class Bar implements Serializable {
Foo fooObject
static constraints = {
fooObject nullable: false
}
}
Run Code Online (Sandbox Code Playgroud)
在webflow中的某个点上,我需要确保fooObject.fooProp1不为null.如果是,我想抛出一个错误并强制用户为它提供一个值.我尝试使用validate()来执行此操作(在Bar和Foo对象上),但由于fooProp1具有nullable:true属性,因此它会通过验证.有任何想法吗?
我有一个问题,我的域类有两个潜在的互斥外部密钥,序列号或遗留查找值.
由于我不确定任何给定条目我将拥有哪一个,我已经使它们都可以为空并添加自定义验证以确保我只有一个值.
package myproject
class Sample {
String information
String legacyLookup
String serialNumber
static constraints = {
information(nullable: true)
legacyLookup(nullable: true)
serialNumber(nullable: true)
legacyLookup validator: {
return ((serialNumber != null && legacyLookup == null) || (serialNumber == null && legacyLookup != null))
}
serialNumber validator: {
return ((serialNumber != null && legacyLookup == null) || (serialNumber == null && legacyLookup != null))
}
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了默认的CRUD屏幕,并尝试为此域类创建一个条目
information: Blah Blah
serialNumber:
legacyLookup: BLAHINDEX123
Run Code Online (Sandbox Code Playgroud)
这在验证器中死亡,并带有以下消息:
No such property: serialNumber for class: myproject.Sample …Run Code Online (Sandbox Code Playgroud) 我想使用database-migration grails插件进行数据库迁移.当我第一次启动Grails应用程序时,会自动创建所有数据库表.我的DataSource.groovy中的生产设置是:
production {
dataSource {
dbCreate = "update"
url = "jdbc:mysql://localhost/myapp?useUnicode=yes&characterEncoding=UTF-8"
username = "test"
password = "test"
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
properties {
validationQuery = "select 1"
testWhileIdle = true
timeBetweenEvictionRunsMillis = 60000
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的config.groovy中,我设置:
grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
Run Code Online (Sandbox Code Playgroud)
当我向域类添加属性时,我需要调整changelog文件.在这种情况下,进行数据库迁移的最佳方法是什么?添加或删除列时,我必须执行哪些步骤?
是否有一种简单的方法可以将JSON字符串反序列化为域类,并支持嵌入式关联; belongsTo和hasMany
{
name: "Customer",
contact: {
name: "Contact"
}
}
class Customer {
name
Contact contact
}
class Contact {
String name
static belongsTo = [customer:Customer]
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中我想做以下事情
def save() {
def customer = new Customer(request.JSON)
customer.save();
}
Run Code Online (Sandbox Code Playgroud)
现在我被迫做了
def save() {
def contact = new Contact(request.JSON.contact);
def customer = new Customer(request.JSON);
customer.contact = contact;
customer.save();
}
Run Code Online (Sandbox Code Playgroud) 使用命令对象时:
class UserCommand {
String name
static constraints = {
name blank: false, unique: true, minSize: 3
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它们来验证对象,而不会使它们持久化.在我的情况下,我将验证持久类用户.
在控制器中:
def save(UserCommand cmd) {
if(!cmd.validate()) {
render view: "create", model: [user: cmd]
return
}
def user = new User()
user.name = cmd.name
user.save()
redirect uri: '/'
}
Run Code Online (Sandbox Code Playgroud)
在messages.properties中:
user.username.minSize.error=Please enter at least three characters.
userCommand.username.minSize.error=Please enter at least three characters.
Run Code Online (Sandbox Code Playgroud)
使用自定义验证消息时,您必须为每个错误编写两次消息代码.一个用于User类,另一个用于UserCommand类.
有没有办法我每个错误只能有一个消息代码?
validation grails grails-validation grails-domain-class grails-2.0
我正在尝试为DateDomain类中的字段设置默认值.
我可以使用defaultValue的mapping配置,但它不与工作Date领域(我就试了一下String,并Integer和正常工作).
这是一个例子:
class Something {
Date myField
static mapping = {
myField defaultValue: new Date()
}
}
Run Code Online (Sandbox Code Playgroud)
此代码失败,因为Hibernate生成的CREATE语句不正确.它是这样的:
... my_field datetime default Mon Nov 25 17:59:08 UYST 2013 not null ...
Run Code Online (Sandbox Code Playgroud) 我想检查以确保两个字段不相等,一个字段大于另一个字段.说yearBorn和yearMarried.他们不能平等,yearMarried必须更大yearBorn.