Я пытаюсь расширить существующий инструмент 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), так что это тоже не должно быть проблемой.
Я не знаком с HSQLDB и его параметрами, но если вы не получаете исключений в приложении, кажется, что таблицы создаются или уже существуют, и это всего лишь ваш метод проверки или ожиданий от того, что должно быть, это проблема. Установите журнал регистрации EclipseLink на лучший, чтобы узнать, что делается между прогонами, и проверьте документы базы данных, чтобы узнать, используете ли вы параметры для получения ожидаемых результатов. – Chris
Согласно документации HSQLDB все должно быть хорошо (насколько я могу видеть), как описано в обновлении OP. Я честно понятия не имею, что делать дальше. – KUSH42