假设Grails控制器中的以下代码:
def action = {
ClassName o = ClassName.findByFoo(params.foo)
if (o) {
o.counter += 1
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,Grails通过默认version添加到所有GORM数据库表的列使用乐观锁定.但是,如果向此操作发送了足够多的多个并发请求,则乐观锁定机制将崩溃,并出现以下异常:
org.hibernate.StaleObjectStateException:
Row was updated or deleted by another transaction (or unsaved-value mapping was
incorrect): [ClassName#id]
Run Code Online (Sandbox Code Playgroud)
对于失败的更新/删除完全不重要的域对象,我想禁用锁定机制,这样就不会抛出任何StaleObjectStateException.我如何实现这一目标?
我编写了一个list()方法,用于检索与一组过滤器匹配的域类实例列表,该方法用于不同的域类; 除了调用GORM方法的类之外,代码完全相同:
Store => Store.createCriteria()
Client => Client.createCriteria()
等.
为了避免代码重复,我尝试通过创建泛型类来创建list方法的通用版本:
class QueryUtils<T> {
def list(params) {
T.createCriteria()
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
这样,我的每个服务(StoreService,ClientService等)都可以扩展QueryUtils:
class StoreService extends QueryUtils<Store>
class ClientService extends QueryUtils<ClientService>
Run Code Online (Sandbox Code Playgroud)
依此类推,并继承与其域类类型对应的list()方法.
问题是在执行期间,它不起作用,因为T的有效类型是java.lang.Object,而不是我指定的域类类型:
groovy.lang.MissingMethodException:没有方法的签名:static java. lang.Object.createCriteria()适用于参数类型:()值:[]
你知道如何解决这个问题吗?
我不想使用GORM创建的ID序列,而是使用16位随机数作为GORM创建的所有表的ID.我需要帮助才能做到这一点.我试过了
static mapping = {id generator:'uuid2'}
它没有用.帮助赞赏
我有三个实现复合模式的类,Item,Cluster和Element.
class Item extends Locatable {
...
}
class Cluster extends Item {
static hasMany = [items:Item]
...
}
class Element extends Item {
...
}
Run Code Online (Sandbox Code Playgroud)
我的域模型比这更复杂,但它只是一个例子.当我有一个Item实例时,我想知道它是一个簇还是一个元素,ins.getClass().getSimpleName()我得到一个奇怪的类名:Item_$$_javassist_165如果我这样做,println ins.toString()我会打印出正确的类名(toString方法返回this.getClass().getSimpleName()).
如何获得正确的班级名称?这个"Item_$$_javassist_165"班级名字是什么?
我已准备好数据库表架构,我需要在我的Grails应用程序中使用它.
我在PostgreSQL中的表格:
CREATE TABLE "user" (
id serial NOT NULL,
login character varying(32) NOT NULL,
password character varying(32) NOT NULL,
email character varying(255) NOT NULL,
date_created time with time zone NOT NULL DEFAULT now(),
last_updated time with time zone NOT NULL DEFAULT now(),
is_banned boolean DEFAULT false,
CONSTRAINT "PK_user_id" PRIMARY KEY (id),
CONSTRAINT "UN_user_email" UNIQUE (email),
CONSTRAINT "UN_user_login" UNIQUE (login)
)
CREATE TABLE profile (
"user" integer NOT NULL DEFAULT nextval('profile_id_seq'::regclass),
first_name character varying(25) NOT NULL,
middle_name character varying(25) NOT …Run Code Online (Sandbox Code Playgroud) 我想创建一个(一个)Domain类的实例(正如预期的那样,它有一个GORM接口到我的数据库)并且只用它作为传递数据的容器,就像Map对象一样.我想要绝对相信我的情况是绝不会在数据库中得到持续.我担心,即使没有明确的调用,GORM也会以某种方式设法将它保存在场景后面的数据库中save().有没有办法在实例化我的对象时指定"不要持久化 "子句?我知道如何防止域类的持久性,我想要的是仅防止对类的特定实例的持久性.
我现在的解决方案是创建一个groovy/src/包含相同属性和方法的类,并将其用作我的数据容器,并根据需要进行类型转换.感觉不对,干涩,干涩.
当然你也可以告诉我,我应该停止这么偏执,并且Grails永远不会在没有显式保存的情况下持久保存域类实例.
我试图在grails中做一对多的域映射.这是两个类:
class TNDetails {
String tn
String tnpk
static hasMany = [iccid: ICCID]
static mapping = {
table 'ni_tn'
version false
tnpk column : 'TN_PK'
tn column: 'TN'
id column: 'TN_PK',name: 'tnpk'
}
}
class ICCID {
String sim
String customer
static belongsTo = [tn: TNDetails]
static mapping = {
table 'ni_sim'
version false
sim column: 'ICCID'
customer column: 'CUSTOMER'
tn column: 'TN_FK'
id column: 'SIM_PK'
}
}
Run Code Online (Sandbox Code Playgroud)
相应的查询可以写成:select TN,ICCID from ni_tn,ni_sim where ni_tn.TN_PK = ni_sim.RELATED_TN and tn_pk=1290.当我通过传递tn_pk这样获取细节时,我的控制器中是否存在: …
我需要调用一些返回各自记录的存储过程,这些记录不会直接映射到表或视图.
我过去使用过存储过程groovy.sql.Sql和普通(未建模)映射,但对于这个应用程序,我想用类似于域类的东西对这些记录进行建模,以便定义数据类型,数据绑定,验证,与其他实体的关联, 等等.
这样做的最佳方法是什么?
我应该将存储过程记录建模为正确的域类(实体),然后尝试禁用(或重新定义)其数据库持久性吗?怎么样?
我应该使用非域POJO来选择性地启用我需要的功能吗?(例如验证@Validatable)我如何处理关联呢?(当从SP返回的记录包含到某个其他持久实体的外键时,就会出现关联.)
我是grails的新手,我正在努力寻找解决方案,但我在这里没有发现任何问题......
我想做的是,我的域名中有这个标签:
String platform
String appVersion
String name
String id
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得appVersion列中存储的所有数据?