我刚刚建立了一个到目前为止仍然非常少的项目maven / jpa / hibernate项目,在这里我试图持久化一个对象。
我的课很简单:
@Entity public class Person { @Id @GeneratedValue private int id; private String name; }
我的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>
最后,这是我用来保留对象的代码:
EntityManager em = entityManagerFactory.createEntityManager(); em.getTransaction().begin(); em.persist(person); // em.flush(); <- does not effect outcome. em.getTransaction().commit(); em.close();
现在,我希望在这里发生两件事:首先,我希望创建Person表(由于hibernate.hbm2ddl.auto = update)。这已经发生过一次,并且正确写出了
CREATE MEMORY TABLE PUBLIC.PERSON( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, NAME VARCHAR(255) )
但我根本无法复制。每次我启动程序时,都会创建hsqldb数据库文件,但不会创建任何表。
其次,我希望持久化对象存储在数据库中,但事实并非如此。另外,手动创建数据库模式也不能解决问题,因此并不是造成此问题的原因。持久代码运行时在输出中没有任何异常或任何警告,这一切看起来都很好。但是对象只是没有到达数据库。使用“来自Person”查询实体管理器时,也找不到该对象。
但是查询似乎是唯一起作用的东西。我可以手动将基准插入数据库,“ from Person”查询将成功检索它。
因此,关于我在这里做错什么的任何提示?
通过axtavt添加一个很好的答案,并阐明您的sleep(1000)的工作原理:对于需要绝对同步持久性的开发环境,请关闭默认的write_delay。
<property name="hibernate.connection.url" value="jdbc:hsqldb:file:data/db/db;shutdown=true;hsqldb.write_delay_millis=0"/>
这意味着在将结果返回给调用方之前,每个语句都已写入磁盘。自然,在正常操作中,您可以增加此值。默认值为500 ms,需要sleep(1000)。给出的信息适用于HSQLDB 2.2.x版。