13

我正在尝试从休眠参考中获取示例。

我有一个简单的表 Pupil,其中包含 id、name 和 age 字段。我根据所有 java-beans 规则为它创建了正确的(如我所想的)java-class。

我已经创建了配置文件 - hibernate.cfg.xml,就像参考中的示例一样。

我已经为一类 Pupil 创建了休眠映射,这是发生的错误。

<hibernate-mapping>
   <class name="Pupil" table="pupils">
       ...
   </class>
</hibernate-mapping>

table="pupils" 在我的 IDE 中是红色的,我看到消息“无法解析表学生”。我还在参考文献中建立了一个非常奇怪的注释,它说大多数用户在尝试运行该示例时都遇到了同样的问题。

啊..我对这个例子很生气..恕我直言,如果作者知道存在这样的问题,他们应该添加一些关于它的信息。

但是,我应该如何解决它?我不想在这里处理 Ant 以及示例中使用的其他工具。我正在使用MySql 5.0,但我认为没关系。

UPD:源代码

Pupil.java - 我的持久类

package domain;

public class Pupil {
    private Integer id;
    private String name;
    private Integer age;

    protected Pupil () { }

    public Pupil (String name, int age) {
        this.age = age;
        this.name = name;
    }

    public Integer getId () {
        return id;
    }

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

    public String getName () {
        return name;
    }

    public void setName (String name) {
        this.name = name;
    }

    public Integer getAge () {
        return age;
    }

    public void setAge (Integer age) {
        this.age = age;
    }

    public String toString () {
        return "Pupil [ name = " + name + ", age = " + age + " ]";
    }
}

Pupil.hbm.xml 是这个类的映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="domain" >

    <class name="Pupil" table="pupils">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name" not-null="true"/>
        <property name="age"/>
    </class>
</hibernate-mapping>

hibernate.cfg.xml - 休眠配置

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hbm_test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="show_sql">true</property>

        <mapping resource="domain/Pupil.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

HibernateUtils.java

package utils;

import org.hibernate.SessionFactory;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new Configuration ().configure ().buildSessionFactory ();
        } catch (HibernateException he) {
            System.err.println (he);
            throw new ExceptionInInitializerError (he);
        }
    }

    public static SessionFactory getSessionFactory () {
        return sessionFactory;
    }
}

Runner.java - 用于测试休眠的类

import org.hibernate.Session;

import java.util.*;

import utils.HibernateUtils;
import domain.Pupil;

public class Runner {
    public static void main (String[] args) {
        Session s = HibernateUtils.getSessionFactory ().getCurrentSession ();

        s.beginTransaction ();
        List pups = s.createQuery ("from Pupil").list ();
        for (Object obj : pups) {
            System.out.println (obj);
        }
        s.getTransaction ().commit ();

        HibernateUtils.getSessionFactory ().close ();
    }
}

我的库:antlr-2.7.6.jar、asm.jar、asm-attrs.jar、cglib-2.1.3.jar、commons-collections-2.1.1.jar、commons-logging-1.0.4.jar、dom4j -1.6.1.jar、hibernate3.jar、jta.jar、log4j-1.2.11.jar、mysql-connector-java-5.1.7-bin.jar

编译错误:无法解析表学生

4

6 回答 6

21

这与 Hibernate 无关,这是一个 IDEA“问题”,您需要正确配置它以在 hbm.xml 中进行表名验证。从这个旧线程

为了让 IntelliJ 为数据库表/列提供正确的代码完成和验证,它还需要了解应用程序的数据库结构。所以,我指的是 IntelliJ 数据源。将其视为“开发时数据源”或类似的东西。

创建一个:
窗口 -> 工具窗口 -> 数据源
添加(“加号”图标) -> JDBC 数据源

作为替代方案,您可以尝试“日期来源”工具窗口中的“导入”按钮。这使得 IntelliJ 在您的项目中搜索一些特定的配置文件(如“hibernate.cfg.xml”),它可以从中直接导入数据源定义。

但是,如果失败,您始终可以手动定义 JDBC 数据源(jdbc url、驱动程序 jar、驱动程序类等)。

配置好数据源后,通过在其上打开 SQL 控制台(数据源工具窗口中的“控制台”按钮)对其进行测试,然后键入一些查询。IDEA 应该在这里为表和列名提供 SQL 代码补全。

如果此步骤有效,请转到数据源的定义,并调用

“刷新表”。这使 IntelliJ 检索数据库结构。

接下来,打开“项目结构”(Ctrl-Shift-Alt-S)。选择您的 Hibernate facet(尽管“Facets”或“Modules”)。

Hibernate facet 的选项屏幕有一个名为“DataSources Mapping”的窗格。在这里,您可以将 Hiberante 会话工厂与特定的 IntelliJ 数据源相关联。

在此步骤之后,SQL 表/列代码完成和验证也应该在 .hbm 文件中工作。

也适用于 IDEA 7,如有必要,请阅读整个线程。

于 2010-05-11T04:22:14.653 回答
15

要验证 hbm.xml 文件映射,只需执行以下操作(Intellij Ultimate 2017.1):

View -> Tool Windows -> Database -> click (+) sign -> Data Source -> MySQL

您已经为数据库的服务器添加了一个数据源。现在您应该创建数据源。下一步是将此数据源添加到休眠映射。跟我来:

View -> Tool Windows -> Persistence

持久性窗口将打开。您必须看到列出的项目。

Right click on the project -> Assign Data Sources...

在打开的窗口中,应该有 2 列:“会话工厂”和“数据源”。只需在第二列中添加上面定义的数据源。

于 2017-06-29T04:28:18.823 回答
1

我们需要更多信息来帮助您。

这是命令行应用程序吗?给出了什么运行时错误?你用的是什么IDE?启用 hibernate 的调试日志记录的输出是什么?

于 2009-06-09T15:06:52.780 回答
1

您的 IDE 告诉您它找不到表。您可以将其更改为 IDEA 中的警告,以便您的项目至少可以编译。

于 2009-06-09T16:43:03.573 回答
1

文件>设置>编辑器>检查>在注释中取消选中未解析的数据库引用

于 2020-06-17T02:03:29.753 回答
0

我猜这不是休眠问题。

无论如何,如果您使用 IntelliJ IDEA IDE 并且 IntelliJ IDEA 显示警告说Cannot resolve table 'some-table-name'.

  1. 检查您是否已Data Source正确创建。单击此处阅读如何设置 MySQL 数据源

  2. 检查您Persistence是否在 IntelliJ IDEA 上正确配置了设置。

您也可以从此处找到有关此警告的更多详细信息。希望你能找到有用的东西。干杯!

于 2021-12-12T10:38:31.417 回答