当前位置: 首页 > 面试题库 >

在Grails 3.0.1中使用休眠注释进行映射

邹弘
2023-03-14
问题内容

如何在Grails 3.0.1中使用注释映射域类?

以下步骤对我不起作用。

步骤1 。我使用Grails 3.0.1(grails create-app books)创建了一个新应用程序。

第二步 。如“ 使用hibernate注释映射”中所述,我在src/main/com/books/Book.groovy(也尝试src/main/groovy/com/books/Book.groovy过)中创建了一个新类。

package com.books;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Book {
    private Long id;
    private String title;
    private String description;
    private Date date;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

第三步 。然后通过向grails- app/conf/hibernate/hibernate.cfg.xml文件中添加相关条目,向Hibernate
sessionFactory注册该类,如下所示:

<!DOCTYPE hibernate-configuration SYSTEM
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <mapping package="com.books" />
        <mapping class="com.books.Book" />
    </session-factory>
</hibernate-configuration>

第四步 。启动应用程序(grails run-app)后,“欢迎使用Grails”页面(grails- app/views/index.gsp)报告了零域类,这意味着映射未生效:

  • Grails运行应用
  • 加载本地主机:8080
  • 请注意“ ARTEFACTS”部分下的“ Domains:0”

Grails 3.0.1中的相关异常

如果我查询上述域类,则抛出以下异常

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Book is not mapped
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
       .hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:332) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3678) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) ~[hibernate-core-4.3.8.Final.jar:4.3.8.Final]
    ... 40 common frames omitted

问题答案:

作为格雷姆认为,该解决方案将hibernate.cfg.xmlgrails-app/conf代替grails- app/conf/hibernate,否则配置将不会生效。我已经提交了一个拉取请求,以在相关文档中反映出来,希望此更新尽快生效,以防止其他用户遇到相同的问题。



 类似资料:
  • 问题内容: 有人可以告诉我为什么出现以下错误吗? 我得到期望的结果,并用数据填充 人员 表,但出现此错误。 这是我正在使用的代码: Person.java 地址.java hibernate.cfg.xml 客户端程序 有人可以帮助我了解我为什么会收到该错误吗? 谢谢。 问题答案: 我猜这是由于您在中指定了属性造成的,因此Hibernate尝试以该名称绑定到JNDI,但是JNDI在您的环境中不可用

  • 问题内容: 我的Java模型上有一个枚举类型,我想映射到数据库中的表。我正在使用休眠注释,但我不知道该怎么做。由于我搜索的答案比较旧,我想知道哪种方法最好? 提前致谢 问题答案: 除了注释,您还需要其他东西吗?例如,以下枚举: 可以这样使用和注释: 您可以使用批注的enum属性指定枚举应如何在数据库中持久化。指定该枚举将作为整数值保留。在这里,设置为将永久保存为0,保留为1,依此类推。 替代方法是

  • 问题内容: 如果您正在使用xml映射,那么liquibase是hibernate的 hbm2ddl_auto 属性的完美替代方案。但是我使用的是JPA注释(hibernate注释)。那么可以使用liquibase吗? 问题答案: 是的,Liquibase使用了hibernate的元数据类,无论您使用xml映射还是注释,它们都是相同的。您确实需要一个hibernate配置文件来指向liquibase

  • 问题内容: 我有两个表,并且在数据库中。在表中,我有一个Integer 对该表的引用。(idA是B的外键)当我使用hibernate- tools进行反向工程时,会生成两个Java对象。 和 但是我想要 我怎样才能做到这一点? 谢谢, 问题答案: 因此,我找到了一个解决方案:创建一个自定义并将方法的返回更改为。

  • 问题内容: 使用注释如何将实体中的字段映射为给定对象,该实体是String的“映射”(哈希表)?该对象带有注释,并且其实例已存储在hibernate数据库中。 我发现了使用简单的键和值来定义地图的语法: 奇怪的是,实体是键,而简单类型是值,像这样: 但是我看不到如何为元素映射的简单键做到这一点,也看不到如何使用注释来做到这一点。 问题答案: 您可以简单地使用 JPA批注 (请注意,JPA批注与Hi

  • 问题内容: 休眠注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,