未找到 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”