Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate EntityManager不写入数据库_Hibernate_Jpa_Hsqldb_Entitymanager - Fatal编程技术网

Hibernate EntityManager不写入数据库

Hibernate EntityManager不写入数据库,hibernate,jpa,hsqldb,entitymanager,Hibernate,Jpa,Hsqldb,Entitymanager,我刚刚建立了一个到目前为止仍然非常小的项目maven/jpa/hibernate项目,在这里我试图持久化一个对象 我的课很简单: @Entity public class Person { @Id @GeneratedValue private int id; private String name; } My persistence.xml也是非常基本的: <persistence xmlns="http://java.sun.com/xml/ns/persis

我刚刚建立了一个到目前为止仍然非常小的项目maven/jpa/hibernate项目,在这里我试图持久化一个对象

我的课很简单:

@Entity
public class Person {
    @Id @GeneratedValue
    private int id;
    private String name;
}
My persistence.xml也是非常基本的:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="Fahrplan_v2">
        <class>model.Person</class>
        <properties>
            <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
            <property name="hibernate.connection.url" value="jdbc:hsqldb:file:data/db/db" />
            <property name="hibernate.connection.username" value="sa" />
            <property name="hibernate.connection.password" value="" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>
    </persistence-unit>
</persistence>
但我根本无法复制。每次启动程序时,都会创建hsqldb数据库文件,但不会创建任何表

其次,我希望持久化对象存储在数据库中,但事实并非如此。此外,手动创建数据库模式并不能解决问题,所以这不是问题的根源。持久化代码运行时没有任何异常或输出中的任何警告,看起来一切都很好。但是对象并没有到达数据库。使用“from Person”查询实体管理器时也找不到该对象

然而,查询似乎是唯一有效的方法。我可以手动将一个数据插入数据库,“from Person”查询将成功检索它


那么,有没有关于我做错了什么的提示?

您需要将
shutdown=true
添加到数据库URL(或发出explict
shutdown
命令),以便正确关闭进程中的HSQLDB数据库:

<property name="hibernate.connection.url" 
     value="jdbc:hsqldb:file:data/db/db;shutdown=true" />             

另请参见:


添加到axtavt的好答案中,并阐明睡眠(1000)是如何工作的:对于需要绝对同步持久性的开发情况,请关闭默认的写入延迟

 <property name="hibernate.connection.url" 
      value="jdbc:hsqldb:file:data/db/db;shutdown=true;hsqldb.write_delay_millis=0"/>             


这意味着在将结果返回给调用方之前,每个语句都会写入磁盘。当然,在正常操作中,可以增加此值。默认值为500毫秒,需要睡眠(1000)。给出的信息是针对HSQLDB 2.2.x版的。

希望这对其他人有所帮助。将写入延迟设置为0毫秒的建议是可行的,但除非您正在创建一个新的数据库,否则它从url不起作用。要应用它,请在连接到数据库时使用下面的sql语句在脚本中运行它:

set files write delay false
例如,您可以使用sqltool.jar运行它,如下所示:

java -jar /path/to/sqltool.jar -sql "set files write delay false;" --inlinerc=<rc spec here>
java-jar/path/to/sqltool.jar-sql“set files write delay false;”--inlinerc=

啊,是的,忘了提那件事了,我之前有过,后来把它删除了,因为我认为它可能会导致这个问题。不管有没有它都不起作用(嗯,好吧,我将把它作为评论发布,因为我还不能回答我自己的问题:我发现了我的问题。em.getTransaction().commit();Thread.sleep(1000);em.close();成功了。在我的测试用例之后,JVM关闭得如此之快,以至于hsqldb根本没有足够的时间将提交的数据持久化到磁盘上。不要问我为什么JVM没有保持活动状态,我不做任何System.exit()调用或任何东西,我的junit测试方法就到此为止。出于某种原因,JVM并没有因为我假设的另一个线程应该持久化我的对象而保持活力。您可以回答您的问题,事实上,我们鼓励您这样做。阅读常见问题解答。您的问题很好,因此请很好地总结答案,以使每个人受益。
set files write delay false
java -jar /path/to/sqltool.jar -sql "set files write delay false;" --inlinerc=<rc spec here>