未找到 Hibernate H2 数据库

Posted

技术标签:

【中文标题】未找到 Hibernate H2 数据库【英文标题】:Hibernate H2 database not found 【发布时间】:2019-01-18 20:47:59 【问题描述】:

我对休眠很陌生,所以我的问题对你来说很明显。我在 H2 控制台中创建了带有 3 个表(data.mv.db)的数据库,插入了一些值,然后将其复制到项目路径中的我的数据库文件夹中。现在我正在尝试读取其中一个进行测试,但总是出现表不存在的错误。我尝试向连接 url 添加属性,例如连接延迟或不将字母更改为大写,但仍然相同。

错误:

原因:org.h2.jdbc.JdbcSQLException: Tabela "LOGIN_DATA" nie 未找到 istnieje 表“LOGIN_DATA”; SQL 语句:选择 login_data0_.ID 作为 ID1_0_,login_data0_.USERNAME 作为 USERNAME2_0_, login_data0_.PASSWORD 为 PASSWORD3_0_,login_data0_.FAVOURITE 为 FAVOURIT4_0_ 来自 PUBLIC.LOGIN_DATA login_data0_ [42102-192] org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 在 org.h2.message.DbException.get(DbException.java:179) 在 org.h2.message.DbException.get(DbException.java:155) 在 org.h2.schema.Schema.getTableOrView(Schema.java:437) 在 org.h2.command.Parser.readTableOrView(Parser.java:5371) 在 org.h2.command.Parser.readTableFilter(Parser.java:1257) 在 org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1896) 在 org.h2.command.Parser.parseSelectSimple(Parser.java:2044) 在 org.h2.command.Parser.parseSelectSub(Parser.java:1890) 在 org.h2.command.Parser.parseSelectUnion(Parser.java:1709) 在 org.h2.command.Parser.parseSelect(Parser.java:1697) 在 org.h2.command.Parser.parsePrepared(Parser.java:445) 在 org.h2.command.Parser.parse(Parser.java:317) 在 org.h2.command.Parser.parse(Parser.java:289) 在 org.h2.command.Parser.prepareCommand(Parser.java:254) 在 org.h2.engine.Session.prepareLocal(Session.java:560) 在 org.h2.engine.Session.prepareCommand(Session.java:501) 在 org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1201) 在 org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:73) 在 org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:289) 在 org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:145) 在 org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:171) ... 17 更多

休眠配置:

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.h2.Driver</property>
        <property name="connection.url">jdbc:h2:file:~/database/data</property>
        <property name="connection.username">admin</property>
        <property name="connection.password">1234</property>

        <property name="hibernate.default_schema">PUBLIC</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping class="data.Login_data"/>
    </session-factory>

</hibernate-configuration>

Login_data 类:

@Entity
@Table(name = "LOGIN_DATA")
public class Login_data 

    private int id;
    private String name;
    private String password;
    private String values;

    public Login_data() 
        // this form used by Hibernate
    

    public Login_data(int id, String name, String password, String values) 
        this.id = id;
        this.name = name;
        this.password = password;
        this.values = values;
    

    @Id
    @GeneratedValue
    @Column(name = "ID")
    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    @Column(name = "USERNAME")
    public String getName() 
        return name;
    

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

    @Column(name = "PASSWORD")
    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    @Column(name = "FAVOURITE")
    public String getValues() 
        return values;
    

    public void setValues(String values) 
        this.values = values;
    

主类:

public static void main(String[] args)
            Login_data user = new Login_data();
            SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.openSession();



                /*session.beginTransaction();
                session.save(user);
                session.getTransaction().commit();*/

                // now lets pull events from the database and list them
                session.beginTransaction();
                List result = session.createQuery("from Login_data").list();
                for (Login_data event : (List<Login_data>) result) 
                    System.out.println(event.getName());
                
                System.out.print(result);
                session.getTransaction().commit();
                session.close();

        

我已尝试编辑配置。所以我补充说:

 <property name="hibernate.hbm2ddl.auto">update</property>

并制作空数据库。奇怪的是在H2 Console中打开后Java创建的数据库和表是不可见的。所以这可能是问题所在。 我想放很多数据,那么如何让它不是来自java的在那里可见?

【问题讨论】:

你不认为显示实际错误会有帮助吗? 引起:org.h2.jdbc.JdbcSQLException: Tabela "LOGIN_DATA" nie istnieje Table "LOGIN_DATA" not found; SQL 语句:以及一长串异常 将其复制到项目路径中的我的数据库文件夹,但希望在~/database/data 中找到数据。那不是您的“项目路径”。那是您的主目录下的目录数据库。 h2database.com/html/features.html#database_url 是的。你说得对。我的错。非常感谢 !带有“mem”的url是否意味着我可以使用相对位置?我想在可运行的应用程序中拥有这个数据库,所以如果我可以在“src”文件夹中设置位置,对我来说最好。 mem 的意思是“在内存中”。因此,您的数据永远不会从文件中加载或保存到文件中。 src 文件夹用于存放您的源文件。数据不是源文件。它与您的 src 文件夹无关。更不用说,一旦您将应用程序实际安装在最终用户的机器上,他们将不会有任何 src 文件夹。该文档解释了您可以提供什么样的路径,并有示例。阅读它。 【参考方案1】:

感谢@JB Nizet,我看到了我的错误。我正在将数据库复制到项目路径,其中我的路径 "~/database" 显示到用户文件夹中的数据库,我正在将它复制到项目文件夹,所以我应该使用 "./database" 。 不过,如果我想使其可运行,我需要使用用户位置来让它在其他机器上正常工作。

【讨论】:

以上是关于未找到 Hibernate H2 数据库的主要内容,如果未能解决你的问题,请参考以下文章

org.h2.jdbc.JdbcSQLException:在使用 H2 数据库进行测试期间未找到列“Id”

如何在 IntelliJ 和 H2 中创建 Hibernate 映射

未找到 H2 数据库

h2 持久存储:未找到数据库

H2数据库用户定义的java函数类未找到

在 oracle 模式下升级 h2 数据库 jar 后选择语句失败