假设一个简单的Grails域类:
class Account {
    String countryId;
    String userName;
    String password;
    static constraints = {
        ...???...
    }
}
要求用户名对于特定countryId是唯一的,因此在两列上必须存在唯一约束.如何在约束定义中表达这一点?
orm grails unique-constraint grails-validation grails-domain-class
我有两个域类,一个是父类,另一个是子类,我们之间有一个hasMany关系.父类有许多子级,子类属于父类.这是编码示例.
class Parent{
   String name
    static hasMany = [childs:Child] 
    static constraints = {
   }
}
class Child{
   String name
   static belongsTo = [parent:Parent]
   static constraints={}
}
问题是,一旦我获得父对象,也会获取与父类关联的子对象.但是当我将对象转换为JSON时,我没有完全看到子对象,我只能看到子对象的ID.我想查看子对象的所有列而不是Id.
转换的JSON响应:
[{"class":"project.Parent","id":1,
  "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}]
但是我也想要包含子对象名称的响应,如下所示
[{"class":"project.Parent","id":1,"name":"name1",
  "childs":[{"class":"Child","id":1,"name":"childname1"},
            {"class":"Review","id":2,"name":"childname2"}
           ]
}]
任何帮助非常感谢.提前致谢.
我想允许用户遍历域类并打印出转储的东西.我的第一个问题:假设以下工作正常:
//this works
class EasyStuffController{
  def quickStuff = {
    def findAThing = MyDomainClass.findByStuff(params.stuff)
    [foundThing:findAThing]
  }
}
写下我想说的内容的正确方法是什么:
//this doesn't
class EasyStuffController{ servletContext ->
  def quickStuff = {
    def classNameString = "MyDomainClass" //or params.whichOne something like that
    def domainHandle = grailsApplication.domainClasses.findByFullName(classNameString)
    //no such property findByFullName
    def findAThing = domainHandle.findByStuff(params.stuff)
    [foundThing:findAThing]
  }
}
//this also doesn't
class EasyStuffController{ servletContext ->
  def quickStuff = {
    def classNameString = "MyDomainClass" //or params.whichOne something like that
    def domainHandle 
    grailsApplication.domainClasses.each{
      if(it.fullName==classNameString)domainHandle=it
    }
    def findAThing = domainHandle.findByStuff(params.stuff) …我正在尝试hasMany使用mapping语句设置我的属性的默认排序.我正在关注grails doc,但它对我不起作用(grails 1.3.5).我的代码看起来像:
class Note {
    Calendar    sendDate
    static belongsTo = Message
}
class Message {
    static  hasMany = [notes: Note]
    static mapping = {
        notes sort:'sendDate desc'
    }
}
错误消息如下所示:
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'notes0_.sendDate' in 'order clause'
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
        at com.mysql.jdbc.Util.getInstance(Util.java:384)
...
你看到我的代码中有任何错误吗?
我知道已经有一个问题,但我认为导致的问题可能因他们所说的而有所不同.我有以下设置:
这个grails应用程序有多个数据源(我不确定这个事实是否与它有任何关系)并且它发生在从第二个数据源调用Domain对象之后,该数据源已经使用grails反向工程插件进行了反向设计(已完成)在一个单独的项目上,然后导入到我的项目.
这是导致Controller层和服务层出现问题的GORM调用
def campusAttributes = CampusAttribute.findAllByNameLike("%Next Option%")
我发现了一些其他的抱怨,这似乎是Maven和grails hibernate插件版本的一个问题,但在那种情况下,问题是grails 2.3.1和特定的hibernate插件版本非常特别.
我所做的只是一个grails run-app(没有用maven构建应用程序也没有任何嘲弄)
提前致谢
想象一下两个共享域类的Grails应用程序.也许是一个Book域类.
一个应用程序被识别为数据的所有者,必须访问域数据.像亚马逊和亚马逊的网络服务.
我想拥有的应用程序将使用普通的域类并通过Web服务公开数据是微不足道的 - 在grails中没有问题.
但是在其他应用程序中实现域的最佳做法是什么?
我正在升级到grails 2.1.x,并且需要重做一些旧式测试.
我刚刚为我的spock Spec添加了一个新测试,对于这个测试,我需要模拟一个额外的Domain类.
在此之前,我有:
@Mock([Event, EventType])
我现在有:
@Mock([Event, EventType, Notification])
Notification.groovy与Event和EventType(在grails-app/domain下)位于相同的包和物理目录中,因此它绝对是一个grails域类.
当我尝试运行测试时,我得到以下堆栈跟踪:
org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Cannot add Domain class [class x.y.Notification]. It is not a Domain!
    at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:911)
    at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:615)
    at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:131)
    at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:128)
当我通过兔子洞并开始调试执行时,我到达DomainClassArtefactHandler的这一部分(第87行):
            // make sure the identify and version field exist
            testClass.getDeclaredField(GrailsDomainClassProperty.IDENTITY);
            testClass.getDeclaredField(GrailsDomainClassProperty.VERSION);
这会引发异常,因为我猜id字段不存在
因此出现了问题,在执行此操作之前不会添加GORM字段.
有没有人建议我需要做什么?我是否需要将我的域类标记为@Entity(这实际上使我的测试通过)?
我很确定我的单元测试不能强制通过.
有什么建议?
更新: 实际上,我刚刚发现只有当我在IDE中运行单元测试时才会出现这个问题:intellij Idea 12.1
创建的问题,测试应用程序在这里:
http://jira.grails.org/browse/GRAILS-9989
http://youtrack.jetbrains.com/issue/IDEA-105087
当我删除两个域类中的静态映射块时,测试通过!
如何在非持久性的域类中设置变量.我希望能够写入和读取该变量,但我不希望它成为表的一部分.
在rails中执行此操作的方法是使用设置变量attr_accessor.Grails有可能这样吗?有谁知道如何做到这一点?
谢谢!
我有一个使用Grails 1.3.7的应用程序,我刚刚迁移到Grails 2.0.该应用程序使用自动dateCreated和lastUpdated字段来管理与创建和修改对象相关的时间戳.升级后,我收到以下错误:
| Running Grails application
| Error 2012-01-29 22:36:53,504 [Thread-8] ERROR util.JDBCExceptionReporter  - ERROR: null value in column "date_created" violates not-null constraint
| Error 2012-01-29 22:36:53,510 [Thread-8] ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session
在我的Domain Classes中注释掉上述字段会使问题消失.
有dateCreated与lastUpdated字段Grails的2.0被弃用?如果是这样,这是否意味着我必须编写代码来手动处理此功能或将代码移动到某种类型的插件,如audit-trail插件?
我有一个父域类,它有hasMany另一个域类.父域和子域类都具有lastUpdated和dateCreated字段.我的问题是,当我更新子域类时,我需要父域类来反映该更改并更新其lastUpdated字段.
Grails提供的父和子之间是否有任何映射或其他配置可以实现此功能?
更新
我将以下行添加到子域类:
def beforeUpdate = {
    parent.lastUpdated = new Date()
}
我还必须在控制器中确保当我更新一个孩子时,我还必须保存父母以保持新lastUpdated字段.这似乎工作正常,但我仍然想知道是否有映射或类似的东西会这样做.