我在Grails写了一个小的webapp,我对控制器设计和使用GORM的最佳实践有以下问题:
我将用户对象存储在session.user中.目前,我的所有操作方法都以下面的代码开头,以确保有效用户已登录并且用户对象是新鲜的:
class FooController {
def actionMethodThatRequiresAValidUser = {
if (!session?.user) {
redirect(controller: "authentication", action: "login")
}
session.user.refresh()
...
/* do stuff */
...
}
}
Run Code Online (Sandbox Code Playgroud)
这是最佳做法吗?它能以更好和/或更简洁的方式完成吗?
我有一个将pdf报告保存到Oracle DB中.报告的dataType是byteArray.
域定义如下:
static constraints = {
report(nullable:false)
company(nullable:false)
month(nullable:false)
}
byte[] report
Company company
Date month
Run Code Online (Sandbox Code Playgroud)
}
不幸的是,这在Oracle DB中定义了一个具有RAW data_type和255的长度的字段.
我该如何将这个字段定义到域类中?应该定义为BLOB?
如果是的话,怎么做?
提前致谢.
是否可以创建一个没有'id'的表?例如,这是我的域名:
class SnbrActVector {
int nid
String term
double weight
static mapping = {
version false
id generator: 'identity'
}
static constraints = {
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此SQL语句时,它失败:
insert into snbr_act_vector values (5, 'term', 0.5)
Run Code Online (Sandbox Code Playgroud)
我检查了表格,'id'已经设置为自动增量.我认为另一种选择是删除'id'本身.或者还有其他解决方法吗?请假设不能更改给定的SQL语句.
我正在使用Nimble和Shiro作为我的安全框架,我刚刚遇到一个GORM错误.确实 :
User.createCriteria().list {
maxResults 10
}
Run Code Online (Sandbox Code Playgroud)
返回10个用户,User.list(max: 10) 返回9个用户!
经过进一步调查,我发现createCriteria 返回两次相同的用户(admin),因为admin有2个角色!(我不是在开玩笑).
似乎任何具有多于1个角色的用户将在createCriteria呼叫中返回两次并User.list返回max-1实例(即9个用户而不是10个用户)
我可以使用哪种解决方法来返回10个唯一身份用户?
这非常烦人,因为我无法正确使用分页.
我的域类是:
class UserBase {
String username
static belongsTo = [Role, Group]
static hasMany = [roles: Role, groups: Group]
static fetchMode = [roles: 'eager', groups: 'eager']
static mapping = {
roles cache: true,
cascade: 'none',
cache usage: 'read-write', include: 'all'
}
}
class User extends UserBase { …Run Code Online (Sandbox Code Playgroud) save()在域类的每次调用之前,是否有一种好的/标准的方法来执行一些公共代码?
例如,我的域名
class Page {
String url
Boolean processed
Date date
Integer urlCrc
}
Run Code Online (Sandbox Code Playgroud)
我的表单只有3个第一个字段,我想在urlCrc每次save()调用方法时计算.我不能只是覆盖保存方法,因为它被注入.
Grails 常见问题解答说:
问:如何从src/groovy中的源访问域类?
有时,您正在开发一些生活在src/groovy中的实用程序类,您打算在服务和其他工件中使用它们.但是,由于这些类是由Grails预编译的,因此无法实例化它们并编写类似Book.findByTitle("Groovy in> Action")的内容.但幸运的是,有一种解决方法,因为它可以这样做:
import org.codehaus.groovy.grails.commons.ApplicationHolder
// ...
def book = ApplicationHolder.application.getClassForName("library.Book").findByTitle("Groovy in Action")
应用程序必须在动态Gorm方法正常运行之前完成自举.
但是,似乎我可以直接导入域对象并在我的src/groovy类中使用GORM方法而没有任何问题,例如:
Book.findByTitle("Groovy in Action")
Run Code Online (Sandbox Code Playgroud)
由于不推荐使用ApplicationHolder,这个建议必须过时,但是仍然有理由避免直接从src/groovy使用域类吗?
我正面临着关于Grails继承的问题.我有一个域类Person.grooy:
class Person{
String name
String contactNumber
Address address
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在为员工和客户扩展Person.groovy,如:
class Employee extends Person{
String designation
}
class Customer extends Person{
String interest
}
Run Code Online (Sandbox Code Playgroud)
现在我想在我的数据库中为Employee和Customer提供单独的表,其中包含Person列,即name,contactNumber和associate address key.我怎么能实现这一点.我搜索过每一个地方,但这方面没什么.这种方法在GORM中是不可能的吗?请回答.多谢你们
我在域中使用BigDecimal作为类型.如果我检查数据库中生成的模式(mySql),则列类型为十进制(19,2).我可以通过使用Domain类中的约束来更改它(如Grails文档中所述),如:
static constraints = {
salary (scale: 3, maxSize:32)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何在我的应用程序中为BigDecimal类型的所有字段定义scale和maxSize?
我已经尝试过在config.groovy中定义它
grails.gorm.default.constraints = {
'*'(scale:10, size:32, class:BigDecimal)
}
Run Code Online (Sandbox Code Playgroud)
或者像那样:
grails.gorm.default.mapping = {
'*'(scale:10, size:32, class:BigDecimal)
}
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用.
Grails vesion是2.2.2.
从Grails belongsTo文档中,有什么用处
class Book {
static belongsTo = Author
}
Run Code Online (Sandbox Code Playgroud)
当对作者执行CRUD操作时,级联操作对Book的影响是什么?
编辑:
感谢您的回复,可能是我没有正确指出我的问题.我想知道它们之间的区别
static belongsTo [author:Author]
Run Code Online (Sandbox Code Playgroud)
VS
static belongsTo = Author
Run Code Online (Sandbox Code Playgroud) 是否有可能通过嵌套的属性进行排序哪里查询?
我有2个域类:
class Parent {
String name
Child child
}
Run Code Online (Sandbox Code Playgroud)
和
class Child {
String name
static belongsTo = [parent: Parent]
}
Run Code Online (Sandbox Code Playgroud)
这有效:
Parent.where {}.list(sort: 'name')
Run Code Online (Sandbox Code Playgroud)
这不是:
Parent.where {}.list(sort: 'child.name')
Run Code Online (Sandbox Code Playgroud)
我有一个错误:
could not resolve property: child.name of: Parent
Run Code Online (Sandbox Code Playgroud)
我使用的是grails 2.3.x.
grails ×10
grails-orm ×10
belongs-to ×1
controller ×1
groovy ×1
hibernate ×1
mysql ×1
nimble ×1
oracle ×1
shiro ×1