在 Grails 3.0.1 中使用 Hibernate 注释进行映射
Mapping with Hibernate Annotations in Grails 3.0.1
如何在 Grails 3.0.1 中映射带有注释的域 class?
以下步骤对我不起作用。
步骤 1。我用 Grails 3.0.1 (grails create-app books
) 创建了一个新应用程序。
步骤 2。如 Mapping with Hibernate Annotations 中所述,我在 src/main/com/books/Book.groovy
中创建了一个新的 class(也尝试了 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;
}
}
步骤 3。然后通过将相关条目添加到 grails-app/conf/hibernate/hibernate.cfg.xml
文件,向 Hibernate sessionFactory 注册 class,如下所示:
<!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>
步骤 4。启动应用程序(grails run-app
)后,'Welcome to Grails'页面(grails-app/views/index.gsp
)报告零域classes,这意味着映射没有生效:
- grails 运行-app
- 加载localhost:8080
- 请注意 'ARTEFACTS'
部分下的 'Domains: 0'
Grails 3.0.1 中的相关异常
如果我查询上面的域class,抛出如下异常
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
按照Graeme的建议,解决方案是将hibernate.cfg.xml
放在grails-app/conf
中,而不是grails-app/conf/hibernate
,否则配置不会生效。我已经提交了pull request to reflect this in the relevant documentation,希望更新尽快生效,以免其他用户遇到同样的问题。
如何在 Grails 3.0.1 中映射带有注释的域 class?
以下步骤对我不起作用。
步骤 1。我用 Grails 3.0.1 (grails create-app books
) 创建了一个新应用程序。
步骤 2。如 Mapping with Hibernate Annotations 中所述,我在 src/main/com/books/Book.groovy
中创建了一个新的 class(也尝试了 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;
}
}
步骤 3。然后通过将相关条目添加到 grails-app/conf/hibernate/hibernate.cfg.xml
文件,向 Hibernate sessionFactory 注册 class,如下所示:
<!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>
步骤 4。启动应用程序(grails run-app
)后,'Welcome to Grails'页面(grails-app/views/index.gsp
)报告零域classes,这意味着映射没有生效:
- grails 运行-app
- 加载localhost:8080
- 请注意 'ARTEFACTS' 部分下的 'Domains: 0'
Grails 3.0.1 中的相关异常
如果我查询上面的域class,抛出如下异常
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
按照Graeme的建议,解决方案是将hibernate.cfg.xml
放在grails-app/conf
中,而不是grails-app/conf/hibernate
,否则配置不会生效。我已经提交了pull request to reflect this in the relevant documentation,希望更新尽快生效,以免其他用户遇到同样的问题。