H2中的休眠ORM问题

时间:2019-09-07 07:34:49

标签: java orm h2 hibernate-mapping

我有一个使用Hibernate和H2数据库的项目。项目目录中有一个H2数据库文件。该数据库文件包含一个表Person。我可以使用H2控制台向该表中插入数据或从中删除数据,但是问题是当我尝试通过Hibernate框架从该表中获取对象时,会出现以下错误:

Caused by: org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement:
select person0_.ID as ID1_0_0_, person0_.NAME as NAME2_0_0_, person0_.PHONE_NUMBER as PHONE_NU3_0_0_ from person person0_ where person0_.ID=? [42102-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.command.Parser.readTableOrView(Parser.java:5920)
    at org.h2.command.Parser.readTableFilter(Parser.java:1430)
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:2138)
    at org.h2.command.Parser.parseSelectSimple(Parser.java:2287)
    at org.h2.command.Parser.parseSelectSub(Parser.java:2133)
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1946)
    at org.h2.command.Parser.parseSelect(Parser.java:1919)
    at org.h2.command.Parser.parsePrepared(Parser.java:463)
    at org.h2.command.Parser.parse(Parser.java:335)
    at org.h2.command.Parser.parse(Parser.java:307)
    at org.h2.command.Parser.prepareCommand(Parser.java:278)
    at org.h2.engine.Session.prepareLocal(Session.java:611)
    at org.h2.engine.Session.prepareCommand(Session.java:549)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247)
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:304)

这是hibernate.cfg.xml文件:

<hibernate-configuration xmlns="http://www.hibernate.org/xsd/orm/cfg">
    <session-factory>
        <property name="connection.url">jdbc:h2:C:\Users\Amir\Desktop\hibernate\src\main\resources\test</property>
        <property name="connection.driver_class">org.h2.Driver</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
        <property name="show_sql">true</property>
    </session-factory>
</hibernate-configuration>

,人POJO:

@Entity
@Table(name = "person")
public class Person {

    @Id
    @Column(name = "ID")
    private String id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "PHONE_NUMBER")
    private String phoneNumber;

    public Person() {}

    public Person(String name, String id, String phoneNumber) {
        this.name = name;
        this.id = id;
        this.phoneNumber = phoneNumber;
    }

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

    public String getId() {
        return this.id;
    }

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

    public String getName() {
        return this.name;
    }

    public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; }

    public String getPhoneNumber() {
        return this.phoneNumber;
    }

    @Override
    public String toString() {
        return "Person {Name= " + name + ", ID= " + id + ", Phone number= " + phoneNumber + "}";
    }

}

最后,休眠连接配置类:

public class PersonDAO {
    private static SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new Configuration().configure().addAnnotatedClass(Person.class).buildSessionFactory();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public PersonDAO() {

    }

    public static void insertRecord(Person person) {
        try (Session session = sessionFactory.openSession()) {
            session.beginTransaction();
            session.save(person);
            session.getTransaction().commit();
        }
    }

    public static Person getRecord(String id) {
        try (Session session = sessionFactory.openSession()) {
            return session.find(Person.class, id);
        }
    }
}

对这个问题有任何想法吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

检查表名的大写字母。您注释了@Table(name = "person"),并报告该表Person存在。据我所记得,H2使用区分大小写的表名。