Właśnie ustawiłem do tej pory jeszcze dość minimalny projekt projektu maven/jpa/hibernate, w którym próbuję utrwalić obiekt.EntityManager nie zapisuje do bazy danych
Moja klasa jest dość prosta:
@Entity
public class Person {
@Id @GeneratedValue
private int id;
private String name;
}
Moja persistence.xml jest bardzo prosty, a także:
<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>
I wreszcie oto kod używam utrzymują się obiekt:
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.persist(person);
// em.flush(); <- does not effect outcome.
em.getTransaction().commit();
em.close();
Teraz są dwie rzeczy, których oczekiwałbym tutaj: Po pierwsze, spodziewam się, że stół Person będzie eated (z powodu hibernate.hbm2ddl.auto = update). To zdarzyło się raz, i to poprawnie wypisało
CREATE MEMORY TABLE PUBLIC.PERSON(
ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,
NAME VARCHAR(255)
)
ale nie mogę tego odtworzyć w ogóle. Za każdym razem, gdy uruchamiam program, tworzone są pliki bazy danych hsqldb, ale nie są tworzone żadne tabele.
Po drugie, oczekuję, że utrwalony obiekt będzie przechowywany w bazie danych, ale tak nie jest. Ponadto ręczne tworzenie schematu bazy danych nie rozwiązuje problemu, więc nie jest to przyczyną. Ciągły kod działa bez żadnych wyjątków lub ostrzeżeń na wyjściu, wszystko wygląda doskonale. Ale obiekt po prostu nie dociera do bazy danych. Obiekt nie zostanie znaleziony podczas sprawdzania menedżera encji za pomocą "od osoby".
Zapytanie wydaje się jednak jedyną rzeczą, która działa. mogę ręcznie wstawić dane do bazy danych, a zapytanie "od osoby" z powodzeniem je pobierze.
tak, wszelkie wskazówki dotyczące tego, co robię źle tutaj?
Hum w porządku, więc będę pisać go jako komentarz, bo nie wolno mi odpowiedzieć na moje własne pytanie (jeszcze?): znalazłem mój problem. em.getTransaction(). commit(); Thread.sleep (1000); em.close(); załatwił sprawę. po moim przypadku testowym JVM wyłączyła się tak szybko, że hsqldb po prostu nie miał wystarczająco dużo czasu, aby utrwalić przesłane dane na dysk. Nie pytaj mnie, dlaczego JVM nie jest utrzymywana przy życiu, nie wykonuję żadnych wywołań System.exit() ani nic takiego, moja metoda testów jednostkowych po prostu się kończy. Z jakiegoś powodu JVM nie jest utrzymywana przy życiu przez to, co zakładam, jest kolejnym wątkiem, który powinien upierać się przed moim obiektem. – MisterD
Możesz odpowiedzieć na swoje pytanie, zachęcić do tego. Przeczytaj FAQ. Twoje pytanie jest dobre, więc dobrze podsumuj odpowiedź, aby wszyscy mogli z niej skorzystać. – Siddharth