一尘不染

EntityManager不写入数据库

hibernate

我刚刚建立了一个到目前为止仍然非常少的项目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”查询将成功检索它。

因此,关于我在这里做错什么的任何提示?


阅读 327

收藏
2020-06-20

共1个答案

一尘不染

通过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版。

2020-06-20