2016-12-28 6 views
0

Я пытаюсь расширить существующий инструмент Java с помощью функции ORM и хочу использовать EclipseLink совместно с HSQLDB. Создание самого соединения не является проблемой (он даже создает структуру файлов/папок HSQLDB, которые вы ожидаете от файловой системы), однако не создается никакой схемы базы данных. При подключении к базе данных с помощью менеджера HSQLDB он будет показывать только свойства базы данных, в противном случае он полностью пуст. Насколько я могу судить, я предпринял все необходимые шаги для создания и инициализации базы данных, я сравнил свой код с 3 учебными курсами по JPA/EclipseLink и нескольким сообщениям stackoverflow, но не смог найти проблему. Любая помощь приветствуется.JPA + EclipseLink + HSQLDB не создает таблицы

Вот мой Актуальной код:

Start.java:

package start; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

import DBmodel.Abteilung; 

public class Start { 

    private Start() { 
    } 

    private static final String PERSISTENCE_UNIT_NAME = "LNDB"; 
    private static EntityManagerFactory factory; 

    public static void main(String[] args) { 

     factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
     EntityManager em = factory.createEntityManager(); 

     Query q = em.createQuery("select a from Abteilung a"); 
     List<Abteilung> abteilungList = q.getResultList(); 
     for (Abteilung abt : abteilungList) { 
      System.out.println(abt); 
     } 

     System.out.println("Elements: " + abteilungList.size()); 
     em.getTransaction().begin(); 
     Abteilung abt = new Abteilung(); 
     abt.setName("test1"); 
     em.persist(abt); 
     em.getTransaction().commit(); 

     em.close(); 
    } 
} 

Abteilung.java:

package DBmodel; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "ABTEILUNG") 
public class Abteilung { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private int id; 
    @Column(name = "Name") 
    private String name; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<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" xmlns="http://java.sun.com/xml/ns/persistence"> 
     <persistence-unit name="LNDB" transaction-type="RESOURCE_LOCAL"> 
      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
       <class>DBmodel.Abteilung</class> 
<properties> 
    <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" /> 
    <property name="javax.persistence.jdbc.url" 
     value="jdbc:hsqldb:file:C:\tmpD\LN" /> 
    <property name="javax.persistence.jdbc.user" value="sa" /> 
    <property name="javax.persistence.jdbc.password" value="" /> 

    <!-- EclipseLink should create the database schema automatically --> 
    <property name="eclipselink.target-database" value="hsql"/> 
    <property name="eclipselink.ddl-generation" value="create-tables" /> 
    <property name="eclipselink.ddl-generation-mode" value="ddl_database_generation" /> 
    <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
</properties> 

     </persistence-unit> 
</persistence> 

выход консоли при запуске Применение:

[EL Info]: 2016-12-28 15:33:11.299--ServerSession(375741537)--EclipseLink, version: Eclipse Persistence Services - 2.3.2.v20111125-r10461 
[EL Info]: 2016-12-28 15:33:18.79--ServerSession(375741537)--file:/C:/LN_Erfassung/target/classes/_LNDB login successful 
Elements: 0 

Update: Я был в состоянии сузить проблему немного. Когда я перестраиваю код в Start.java и создаю несколько объектов, тогда вызываем abteilungList.size(), он вернет ожидаемый результат (количество созданных объектов). Теперь это, очевидно, означает, что соединение с базой данных прекрасное и работает, но при удалении приложения при удалении. Это было бы ожидаемым поведением для HSQLDB, если бы я сконфигурировал его для записи в память в файле persistence.xml, однако вместо этого я решил записать в файл. Вещь, которая делает это еще более странным, заключается в том, что HSQLDB Manager вернет SQLException, пытаясь получить доступ к базе данных, потому что есть блокировка. Это означает, что моя реализация HSQLDB записывается в файловую систему, а не в память, и что таблицы должны сохраняться. По умолчанию HSQLDB также создает таблицы MEMORY, а не TEMPORARY таблицы (согласно http://hsqldb.org/doc/guide/guide.html#sgc_persist_tables), так что это тоже не должно быть проблемой.

+0

Я не знаком с HSQLDB и его параметрами, но если вы не получаете исключений в приложении, кажется, что таблицы создаются или уже существуют, и это всего лишь ваш метод проверки или ожиданий от того, что должно быть, это проблема. Установите журнал регистрации EclipseLink на лучший, чтобы узнать, что делается между прогонами, и проверьте документы базы данных, чтобы узнать, используете ли вы параметры для получения ожидаемых результатов. – Chris

+0

Согласно документации HSQLDB все должно быть хорошо (насколько я могу видеть), как описано в обновлении OP. Я честно понятия не имею, что делать дальше. – KUSH42

ответ

0

Вопрос состоял в том, что EntityManagerFactory не был закрыт. По-видимому, HSQLDB не сохраняет данные на диске до этого из-за chaching (что также делает его неконкурентным в этом случае).

Добавление factory.close(); к коду перед окончанием выполнения приведет к его записи в файл сценария.

Я уверен, что есть какой-то способ отключить кеширование и немедленно его записать на диск, но я не стал больше смотреть на него.

Я пробовал точно такой же код с Apache Derby (обновленный pom.xml и persistence.xml, тот же код), и он вел себя так, как я ожидал, записывая о сохранении объекта и совершении транзакции.

Смежные вопросы