假设我有一个使用原始SQL更新计数器的计数器函数:
public void updateCounter() {
executeSql("UPDATE counter SET count_value = count_value + 1 WHERE id = 1;");
}
Run Code Online (Sandbox Code Playgroud)
数据库将确保按计划处理对计数器的两个并发调用 - 所有调用将以一个增量更新计数器,并且不会丢失更新.
而不是通过发出原始SQL命令执行此操作,我想使用GORM.这种天真的方式将是这样的:
public void updateCounter() {
Counter c = Counter.get(1)
c.countValue += 1
c.save()
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我假设如果两个线程同时调用updateCounter()方法,则更新可能会丢失.处理这种并发问题的正确"Grails/GORM方式"是什么?
我有这样的关系:
class E {
string name
hasMany = [me:ME]
}
class M {
float price
}
class ME {
E e
M m
int quantity
}
Run Code Online (Sandbox Code Playgroud)
而且我讨厌迭代来实现这个目标:"获得ME中数量的总和乘以给定E的相应M的价格".
有关如何使用GORM/HQL实现它的任何提示?
提前致谢
我想知道如果数据库是MS SQL 2005,是否可以设置VARCHAR列的大小.这是我的域名:
class UpdateTable {
static mapping = {
table 'UpdateTable'
id column: 'UpdateFileId', generator: 'increment'
version false
fileName column: 'FileName', size: 50
}
String fileName
}
Run Code Online (Sandbox Code Playgroud)
请注意,它使用VARCHAR(255)生成"FileName"列.我想将它设置为VARCHAR(25).也试过这个,但它没有用
static mapping = {
..
fileName column: 'FileName', length: 50
}
Run Code Online (Sandbox Code Playgroud)
感谢您的任何线索.
我试图建立一个类似于的动态查询:
def domain = DomainName
def ids = 1
def domainClass = "$domain" as Class
domainClass.find("from ${domain} as m where m.job = ${ids} ").id
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
如果我正在尝试这个,一切都很好:
def domain = DomainName
def ids = 1
DomainName.find("from ${domain} as m where m.job = ${ids} ").id
Run Code Online (Sandbox Code Playgroud)
如何在find中使用动态域名类?
我有4个类,事件,问题,请求,另一个是附件.
每个域看起来像.........
Class Incidents
{
// other fields
static hasOne = [attachment: Attachment]
static constraints = [attachment nullable:true]
}
Class Problems
{
// other fields
static hasOne = [attachment: Attachment]
static constraints = [attachment nullable:true]
}
Class Requests
{
// other fields
static hasOne = [attachment: Attachment]
static constraints = [attachment nullable:true]
}
Class Attachment
{
// other fields
static belongsTo= [
incident: Incidents,
problem: Problems,
requests: Requests
]
static constraints = {
incident nullable: true
problem nullable: true
requests …Run Code Online (Sandbox Code Playgroud) grails grails-orm grails-plugin grails-domain-class grails-2.0
我有两个对象:User和Resume.简历有一个User user字段.在我的代码中,我首先得到一个user对象并对其进行一些更改.如果Resume.findByUser(user)存在,我会收到简历并在那里做一些更改.
如果我打电话user.save(),resume.save()我得到一个例外,说会话中有同一个对象的另一个引用,所以我开始使用merge().
当我调用user.merge()数据时保存,但是当我调用时,resume.merge()我得到了这个异常:
org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session: [com.wizard.security.User#36]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.wizard.security.User#36]
我不知道该怎么做.看起来问题出现在与之resume.user相同的对象中user.
我很感激你对这个问题的帮助,谢谢.
我有一个查询,它进行2次数据库查询.我是GORM的新手,不知道如何使用条件或where子句或其他内容将其优化为1个查询.我也使用springsecurity并且具有用于登录安全性的User类.我有一个带有User对象的Profile类:
class Profile {
User user
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,会话存储用户ID.当我想加载配置文件来更新它时,我的代码目前是:
def user = User.get(springSecurityService.principal.id) // 1st db query
def domainObject = Profile.findByUser(user) // 2nd db query
Run Code Online (Sandbox Code Playgroud)
我通过试验和错误尝试了一些查询变体,但似乎找不到不会产生错误的查询.这似乎是微不足道的.伪查询将"获取具有此用户ID的profile.user的配置文件".
默认情况下,当您在grails中创建域对象时,它会添加"id"列并将其设置为在DB中自动递增.
我想在创建/保存对象时提供id参数,而不是使用任何类型的生成(它用于少量静态数据,我希望将ID固定为我给出的值).
我还有其他好处,例如能够在内存中使用正确的ID创建对象,而不必从DB中读取它,然后使该对象与另一个对象成为"包含"类型的关系,如果这是有意义的.
Grails有id列的文档,但没有说如何禁用自动增量并允许将ID传递给域对象构造函数:
我有域名说
class Content{
String content
Date dateCreated
Date lastUpdated
}
Run Code Online (Sandbox Code Playgroud)
数据库中的内容记录很少.我想检索最新的两条记录.在Grails中查询两个最新记录的有效方法是什么?谢谢!
我的域类中有一个临时方法,它将更新类的属性.当我使用此方法时,类不会标记为脏并且不会保存.
class Major {
String code
String major
static transients = ['update']
def update(String newVal) {
major = newVal
}
}
Major major = Major.findByCode("ACAA");
major.update("NEW VALUE");
println("Is dirty? "+ major.dirty); //Is dirty? false
Run Code Online (Sandbox Code Playgroud)
当我在方法之外更新属性时,它按预期工作,我可以保存
Major major = Major.findByCode("ACAA");
major.major = "NEW VALUE";
println("Is dirty? "+ major.dirty); //Is dirty? true
Run Code Online (Sandbox Code Playgroud)
有什么理由不起作用吗?
Grails 3.3.1
GORM 6.1.6
grails ×10
grails-orm ×10
hibernate ×4
concurrency ×1
grails-2.0 ×1
groovy ×1
hql ×1
transactions ×1