Hibernate EntityManager不写入数据库
我刚刚建立了一个到目前为止仍然非常小的项目maven/jpa/hibernate项目,在这里我试图持久化一个对象 我的课很简单: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
@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(或发出explictshutdown
命令),以便正确关闭进程中的HSQLDB数据库:
<property name="hibernate.connection.url"
value="jdbc:hsqldb:file:data/db/db;shutdown=true" />
另请参见:
<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>