EntityManager не пишет в базу данных - PullRequest
5 голосов
/ 12 ноября 2011

Я только что создал пока еще очень минимальный проект 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 создаются, но таблицы не создаются.

Во-вторых, я ожидаю, что сохраненный объект будет сохранен в базе данных, но это не так. Кроме того, создание схемы базы данных вручную не решает проблему, так что это не является причиной ее возникновения. Постоянный код выполняется без каких-либо исключений или предупреждений в выводе, все выглядит отлично. Но объект просто не поступает в базу данных. Объект также не найден при запросе менеджера сущностей с помощью «from Person».

Однако запросы, кажется, единственное, что работает. я могу вручную вставить данные в базу данных, и запрос «от человека» успешно извлечет их.

итак, есть какие-нибудь намеки на то, что я здесь не так делаю?

Ответы [ 3 ]

5 голосов
/ 13 ноября 2011

Добавление к хорошему ответу axtavt и разъяснение того, как работает ваш сон (1000): Для ситуаций разработки, когда вы хотите абсолютно синхронное постоянство, отключите стандартную запись write_delay.

 <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.

3 голосов
/ 12 ноября 2011

Вам необходимо добавить shutdown=true к URL базы данных (или выполнить команду explict SHUTDOWN), чтобы правильно завершить работу базы данных HSQLDB:

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

также:

0 голосов
/ 12 ноября 2014

Надеюсь, это кому-нибудь поможет. Предложение установить задержку записи на 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>
...