【问题标题】:Hibernate exception : table is not mapped休眠异常:表未映射
【发布时间】:2016-02-05 11:59:39
【问题描述】:

我正在尝试使用 hibernate 连接到 Postgres,但是我收到了表未映射的异常。这是代码:

hibernate.cfg.xml

    <!DOCTYPE hibernate-configuration SYSTEM
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.username">username</property>
    <property name="hibernate.connection.password">passwrd</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/dbname</property>
    <property name="hibernate.hbm2ddl.auto">create</property>
    <property name="connection.pool_size">1</property>
    <property name="show_sql">true</property>
    <mapping class="backend.hibernate.models.UsersEntity"/>
</session-factory>

用户实体:

@Entity
@Table(name = "Users")
@Getter
@Setter
public class UsersEntity {
@Id
@Column(name = "id")
@GeneratedValue
private int id;
@Column(name = "login")
private String login;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;

}

pom:

<properties>
    <hibernate.version>5.0.3.Final</hibernate.version>
    <postgresql.version>9.4-1200-jdbc4</postgresql.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <!-- The tutorials use the PostgreSQL 9.3.5 database -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.version}</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

错误:

 Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: UsersModel is not mapped [select login from UsersModel]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:218)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:298)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836)
at Fronted.Main.main(Main.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: UsersModel is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:171)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:76)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:321)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3678)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
... 13 more

主要:

  public class Main {
public static void main(String[] args) {
    Configuration configuration = new Configuration().configure();
    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration
            .getProperties());
    SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    List<UsersModel> list = session.createQuery("from UsersEntity").list();
    session.close();
    System.out.println(list);
}
}

在我的数据库中,我有一个名为“Users”的表,其中包含像 UsersEntity 注释中的列。我认为,该映射已正确完成,但是我仍然遇到相同的错误。感谢您的帮助

【问题讨论】:

标签: java hibernate postgresql maven


【解决方案1】:

错误很明显“UsersModel 未映射”。这意味着您正在尝试在查询中使用尚未进行任何映射的类。

您正在通过以下方式查询UsersModel

List<UsersModel> list = session.createQuery("select login from UsersModel").list();

但是映射到Users表的实体类是UsersEntity

@Entity
@Table(name = "Users")
public class UsersEntity

您应该执行以下查询:

List<UsersEntity> list = session.createQuery("select login from UsersEntity").list();
// Map from UsersEntity to UsersModel if needed

【讨论】:

  • 我搞砸了。我正在同时尝试 2 个项目并复制了错误的主类。已编辑主帖,查询与你的类似。
【解决方案2】:

也许你在 hibernate.cfg.xml 中映射了一个错误的类名。

在你的 xml 中:

<mapping class="backend.hibernate.models.UsersModel"/>

在您的 Java 类中:

public class UsersEntity

尝试像这样更改您的 xml:

<mapping class="backend.hibernate.models.UsersEntity"/>

【讨论】:

  • 查询"select login from UsersModel" 仍然会抛出异常。
  • 并将查询更改为 "select login from UsersEntity" 。我在写答案时忘记了这一点。
【解决方案3】:

因为您使用实体名称作为

UsersEntity

所以请从

更改hibernate.cfg.xml
<mapping class="backend.hibernate.models.UsersModel"/>

<mapping class="backend.hibernate.models.UsersEntity"/>

和主要变化:从

List<UsersModel> list = session.createQuery("select login from UsersModel").list();

List<UsersEntity> list = session.createQuery("select login from UsersEntity").list();

【讨论】:

  • 我同时打开了 2 个项目,不小心从错误的项目中复制了片段。在正确的一个中,我有映射类,就像你写的那样,查询是从 UsersEntity 表中获取信息。为失误抱歉。用正确的数据编辑了第一篇文章
  • 你还在使用 List list = session.createQuery("from UsersEntity").list(); not List list = session.createQuery("from UsersEntity").list();所以请检查一下。
【解决方案4】:

也可以通过以下方式以编程方式添加:

Configuration configuration = new Configuration();
configuration.configure("hibernate-local-query-test.cfg.xml");
configuration.addAnnotatedClass(ClassName.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多