将 JPAContainer 与 Vaadin Framework 一起使用时,服务器重置时缺乏持久性
Lack of persistence on server reset while using JPAContainer with Vaadin Framework
我在我的 Vaadin(基于 GWT Java Web 应用程序框架)应用程序中使用 JPAContainer 实现。随着开发接近尾声,我 运行 遇到了一些小问题,所有这些都在一定程度上与持久性有关(因为实际上没有数据被放入数据库中,并且在我重新启动时全部丢失服务器)。
这里是我从 PERSISTENCE_UNIT
定义实体管理器的地方
private static JPAContainer<QueryableDicom> dicomDataContainer; @PersistenceContext(unitName = "companynamedb")
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
transient EntityManager entityManager = entityManagerFactory.createEntityManager();
这就是我实例化 JPAContainer 的方式
dicomDataContainer = JPAContainerFactory.make(QueryableDicom.class, entityManager);
这是我 persistence.xml 的相关部分:
<persistence-unit name="companynamedb">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.jdbc.platform"
value="org.eclipse.persistence.platform.database.H2Platform" />
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/./dcmCache" />
<property name="javax.persistence.jdbc.user" value="user" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
我不确定这是否有帮助,但这是我将实体添加到容器的方法:
entityManager.getTransaction().begin();
for (int i = 0; uploads[i] != null; i++) {
dicomDataContainer.addEntity(uploads[i]);
}
entityManager.getTransaction().commit();
我主要是在寻找有关查找位置的提示和技巧,我已经用谷歌搜索了两个星期了
您将持久性单元设置为在每次通过 "eclipselink.ddl-generation" 属性 值 "drop-and-create-tables" 部署持久性单元时删除和创建所有表。每次服务器重新启动时都会进行部署,这就解释了为什么会丢失数据。
此设置仅适用于可能存在与先前架构不兼容的剧烈实体更改的开发。您可能想要使用 "create" 或 "create-or-extend-tables",如 here
所述
我在我的 Vaadin(基于 GWT Java Web 应用程序框架)应用程序中使用 JPAContainer 实现。随着开发接近尾声,我 运行 遇到了一些小问题,所有这些都在一定程度上与持久性有关(因为实际上没有数据被放入数据库中,并且在我重新启动时全部丢失服务器)。
这里是我从 PERSISTENCE_UNIT
定义实体管理器的地方private static JPAContainer<QueryableDicom> dicomDataContainer; @PersistenceContext(unitName = "companynamedb")
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
transient EntityManager entityManager = entityManagerFactory.createEntityManager();
这就是我实例化 JPAContainer 的方式
dicomDataContainer = JPAContainerFactory.make(QueryableDicom.class, entityManager);
这是我 persistence.xml 的相关部分:
<persistence-unit name="companynamedb">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.jdbc.platform"
value="org.eclipse.persistence.platform.database.H2Platform" />
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/./dcmCache" />
<property name="javax.persistence.jdbc.user" value="user" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
我不确定这是否有帮助,但这是我将实体添加到容器的方法:
entityManager.getTransaction().begin();
for (int i = 0; uploads[i] != null; i++) {
dicomDataContainer.addEntity(uploads[i]);
}
entityManager.getTransaction().commit();
我主要是在寻找有关查找位置的提示和技巧,我已经用谷歌搜索了两个星期了
您将持久性单元设置为在每次通过 "eclipselink.ddl-generation" 属性 值 "drop-and-create-tables" 部署持久性单元时删除和创建所有表。每次服务器重新启动时都会进行部署,这就解释了为什么会丢失数据。
此设置仅适用于可能存在与先前架构不兼容的剧烈实体更改的开发。您可能想要使用 "create" 或 "create-or-extend-tables",如 here
所述