我需要在GORM中自定义复合外键的列名,我没有找到任何显示如何执行此操作的文档.我知道如何自定义PK列,以及如何自定义单列FK,而不是自定义多列FK.有可能吗?
谢谢.
我是grails的新手,并尝试创建一个表单,允许用户更改与他/她的帐户相关联的电子邮件地址.
它要求用户输入他们当前的密码以及他们想要使用的新电子邮件地址.如果用户输入了错误的密码或无效的电子邮件地址,那么它应该使用适当的错误消息拒绝它们.
现在,可以通过grails中的约束来完成电子邮件验证,但密码更改必须与其当前密码相匹配.我已将此检查作为服务类的方法实现.
见下面的代码:
def saveEmail =
{
def client = ClientUser.get(session.clientUserID)
client.email = params.email
if(clientUserService.checkPassword(session.clientUserID , params.password) ==false)
{
flash.message = "Incorrect Password"
client.discard()
redirect(action:'changeEmail')
}
else if(!client.validate())
{
flash.message = "Invalid Email Address"
redirect(action:'changeEmail')
}
else
{
client.save();
session.clientUserID = null;
flash.message = "Your email address has been changed, please login again"
redirect(controller: 'clientLogin' , action:'index')
}
}
Run Code Online (Sandbox Code Playgroud)
现在我发现奇怪的是,如果我输入了一封无效的电子邮件,那么就不会保存更改(如预期的那样)但是如果我输入了错误的密码和有效的电子邮件,那么它会保存更改,甚至将它们写回到数据库,即使它会给出正确的"无效密码"错误消息.
我很困惑,所以在所有if/else if/else块中设置了断点,发现它按预期命中了第一个if语句而没有击中其他语句,所以它永远不会遇到对save()方法的调用,然而它无论如何都得救了.
经过一些研究后,我来到了discard()方法的文档中,您可以在上面的代码中看到它.所以我添加了这个,但仍无济于事.我甚至尝试使用discard然后再次从DB重新加载客户端对象,但仍然没有骰子.
这是非常令人沮丧的,我会感激任何帮助,因为我认为这肯定不是一个复杂的要求!
有没有办法告诉GORM不要坚持财产?我打算在我的User类上定义一个确认密码属性,我将用于验证,但不应该保留.
我在Grails的createCriteria中看到了一些意想不到的行为.我有一个看起来像这样的域类:
MyDomainClass {
AnotherDomainClass anotherDomainClass
static constraints = {
anotherDomainClass(nullable:true)
}
}
Run Code Online (Sandbox Code Playgroud)
我想找到MyDomainClass的所有实例,其中anotherDomainClass为null.所以我这样做:
return MyDomainClass.createCriteria().list {
eq('anotherDomainClass', null)
}
Run Code Online (Sandbox Code Playgroud)
但是,我一无所获.
我究竟做错了什么?我可以看到有一些数据库条目,其中ANOTHERDOMAINCLASS_ID列确实为空(或空白,我无法分辨).
我可以直接创建一个引用ANOTHERDOMAINCLASS_ID列的查询,但我还没有找到方法.
谢谢!
我有一个域类,Widget,我需要删除所有实例 - 清除它.之后,我将加载新数据.你有什么建议这样做的机制?
PS注意这不是在自举时间,而是在"运行时".
在我的grails(1.3.7)应用程序中,我使用JDBC模板从CSV文件批量导入1000个记录(因为它比使用vanilla GORM/hibernate快得多,正如您所期望的那样).
例如
class Book {
String title
}
Run Code Online (Sandbox Code Playgroud)
和
// For each CSV record...
insertStatementList.add("insert into book (id, title) values (nextval('hibernate_sequence'), thetitle)")
...
JdbcTemplate bulkInsert = ...
bulkInsert.batchUpdate(insertStatementList)
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是域类的更改(例如添加subject属性)需要更改域类和SQL插入语句.
由于GORM/hibernate堆栈最终必须从域类定义派生SQL,有没有办法访问此功能,以便我不必单独维护SQL insert语句?或者在伪代码中,类似于以下内容:
// would return something like:
// "insert into book (id, title) values (nextval('hibernate_sequence'), 'thetitle')"
def insertStatement = hibernate.getSqlInsertForClass(Book, book.properties)
Run Code Online (Sandbox Code Playgroud) 我正在使用Grails 2.1.1和MySQL 5.5.27 Community Server.
我需要一个Domain类字段生成一个TEXT或LONGTEXT列.
我觉得这很简单,我看过很多例子:
但是,我整晚都遇到了死胡同.我遵循了所有这些例子,似乎都没有工作(即使其他人报告它有效).
以下是我创建的域类示例:
class Coltest {
static constraints = {
description1 sqlType: 'longtext'
description2 sqlType: 'text'
description3 type: 'text'
description4 column: "longDescription", type: "text", nullable:true
}
String description1
String description2
String description3
String description4
}
Run Code Online (Sandbox Code Playgroud)
这是我在MySQL命令界面中得到的:
mysql> describe coltest;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下结构的方法:
public void run(){
...
for (...) { //this part works correct
User.withTransaction {
User user = User.findByUsername(...);
Position pos = Position.findByName(...)
if(pos){ ...
} else { ...
try{
pos.save(flush:true);
user.position = pos;
} catch (Exception e){ ... }
}
...
try{
user.save(flush:true, failOnError: true);
} catch (Exception e){ ... }
}
}
//this part doesn't work
User.findAll().each {
...
if (...){
User.withTransaction{
...
//here the operation fails with
//org.hibernate.LazyInitializationException:
//could not initialize proxy - no Session
if (!userDetailsMap.containsKey(it.username)
&& …Run Code Online (Sandbox Code Playgroud) 空白和空约束之间有什么区别?
我有以下课程
class Task {
String title
String notes
TekUser assignedTo
Date dueDate
TekEvent event
static constraints = {
title blank:false
notes blank: true , maxSize: 5000
assignedTo nullable:true
dueDate nullable:true
}
static belongsTo = TekEvent
}
Run Code Online (Sandbox Code Playgroud)
并且即使我指定了,创建的mysql表也将注释设置为not null notes blank : true
空白有什么影响:真的有吗?
我不得不将Spring从1.2.7更新到2.0,以及Grails从2.2.0更新到2.3.11.在解决了一些典型的更新问题之后,我开始为测试服务器构建一个WAR.一切似乎都好.但经过几次部署后,我遇到了一个问题.
有时(没有规则)服务器有100%的CPU使用率 - > OutOfMemeryError或应用程序抛出错误500.调试后,我注意到这些问题的原因是SQL查询不正确.
查询地点:
UserRole.find{role.authority =~ "%${authTxt}" && user.id == currentUser.id}
Run Code Online (Sandbox Code Playgroud)
创建这样的SQL:
select this_.id as id1_35_2_, this_.payment_enabled as payment_2_35_2_, this_.role_id as role_id3_35_2_, this_.user_id as user_id4_35_2_,
role_alias1_.id as id1_29_0_, role_alias1_.version as version2_29_0_, role_alias1_.authority as authorit3_29_0_, user_alias2_.id as id1_36_1_,
user_alias2_.version as version2_36_1_, user_alias2_.account_expired as account_3_36_1_, user_alias2_.account_locked as account_4_36_1_,
user_alias2_.auto_password_flag as auto_pas5_36_1_, user_alias2_.email as email6_36_1_, user_alias2_.enabled as enabled7_36_1_,
user_alias2_."password" as password8_36_1_, user_alias2_.password_expired as password9_36_1_, user_alias2_.user_info_id
as user_in10_36_1_, user_alias2_.username as usernam11_36_1_ from user_role this_ inner join role role_alias1_ on this_.role_id=role_alias1_.id …Run Code Online (Sandbox Code Playgroud) grails ×10
grails-orm ×10
hibernate ×3
composite ×1
foreign-keys ×1
grails-2.0 ×1
grails-2.3 ×1
groovy ×1
java ×1
jdbctemplate ×1
mapping ×1
mysql ×1