【问题标题】:grails domain class expose id for java classesgrails域类公开java类的id
【发布时间】:2012-11-26 08:11:04
【问题描述】:

我有一个关于 grails 域类的相当简单的问题。我不确定我知道如何正确表达它,因为我似乎无法在谷歌上找到答案。

我有一个 groovy 域类

class DomainObject {
    String name
    String email
}

还有一个使用此域对象的 java 类。

public class DomainUser {
    public void method() {
        DomainObject object = new DomainObject();
        object.getId();
    }
}

但是我在线上遇到错误

object.getId();

带有消息:

方法getId()未定义该类型

由于 id 是由 grails 应用程序/hibernate 自动生成的,如何将 id 公开给 java 类?

【问题讨论】:

  • 是什么给了你错误? grails compile 还是你的 IDE?在编译时通过 AST 转换将许多半神奇的东西添加到 Grails 人工制品类中(其中之一是用于域类的 getId()),如果您的 IDE 不知道这些转换,它将失败。
  • 另外,顺便说一句,Grails 通过元类机制覆盖域类构造函数,以使诸如将服务自动装配到域中之类的事情正常工作。因此,如果您想在 Java 代码中“新建”一个域类,您应该使用 InvokerHelper.invokeNoArgumentsConstructorOf(DomainClass.class),这是 Java 调用元类提供的构造函数而不是真正的构造函数的方式。

标签: java hibernate grails groovy


【解决方案1】:

Id 字段是在运行时生成的,java 对动态引用一无所知。 从服务层访问该域。 http://grails.org/doc/latest/guide/services.html#usingServicesFromJava

还有谷歌:“grails access service java”

第一个结果是http://grails.1312388.n4.nabble.com/Question-How-do-I-reference-a-Grails-service-from-within-Java-class-td1462056.html

你可以在你的 DomainService.groovy 中写一些这样的东西

class DomainService(){
    def persistAndGetNewDomain(){
       new Domain().save(flush:true)    
    }
}

您还必须将 id 字段添加到您的域类中

class DomainObject {
    Long id
    String name
    String email
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多