我想擴展現有的具有ORM功能的Java工具,並希望將EclipseLink與HSQLDB結合使用。創建連接本身不是問題(它甚至會創建文件系統期望的HSQLDB文件/文件夾結構),但是沒有創建數據庫方案。當使用HSQLDB管理器連接到數據庫時,它只會顯示數據庫屬性,否則它是完全空的。據我可以告訴我採取了所有必要的步驟來創建和初始化數據庫,我將我的代碼與JPA/EclipseLink和幾個stackoverflow帖子上的3個教程進行了比較,但無法找到問題。任何幫助表示讚賞。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
更新:我能夠縮小問題一點。當我在Start.java中重新排列代碼並創建多個對象時,調用abteilungList.size()它將返回預期結果(創建的對象數)。現在這顯然意味着數據庫連接正常並且正常工作,但是應用程序在退出時會丟棄表。如果我將它配置爲寫入persistence.xml中的內存,這將是HSQLDB的預期行爲,但我選擇寫入文件。讓這個更奇怪的事情是HSQLDB Manager在嘗試訪問數據庫時將返回SQLException,因爲它存在鎖定。這意味着我的HSQLDB實現正在寫入文件系統,而不是內存,並且表應該保留。 HSQLDB默認也是創建MEMORY表,而不是TEMPORARY表(根據http://hsqldb.org/doc/guide/guide.html#sgc_persist_tables),所以也不應該是這個問題。
我不熟悉的HSQLDB及其選項,但如果你沒有在應用程序獲得的例外,它很可能正在創建的表或已經存在,它只是你的檢查或期望的方法是什麼應該存在那個問題。將EclipseLink日誌記錄設置爲最佳狀態以查看運行之間所做的操作,並檢查數據庫文檔以查看是否使用選項來獲得期望的結果。 – Chris
根據HS更新的說明,根據HSQLDB文檔,一切都應該沒有問題(據我所見)。我真的不知道下一步該怎麼做。 – KUSH42