我想基于实体创建数据库。配置:
- Glassfish:GlassFish Server开源4.1版(版本13)
- Eclipselink:Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd(随glassfish一起提供)
- 数据库:PostgreSQL版本:9.4.2
- 驱动程序:PostgreSQL本机驱动程序版本:PostgreSQL 9.4 JDBC4.1(版本1201)
从eclipselink开始创建数据库的那一刻起,在将大量日志参数放在最佳状态后,我在日志中看到以下语句:
- SELECT ID FROM table_name WHERE ID<> ID
- SELECT 1
重复4-5次。第一个查询给出了以下明显的postgres错误:
org.postgresql.util.PSQLException:错误:关系" table_name"不存在 位置:16
因此,以下查询会出现以下错误:
org.postgresql.util.PSQLException:错误:当前事务被中止,命令被忽略直到事务块结束
此eclipselink继续创建表格后:
CREATE TABLE table_name(ID BIGINT NOT NULL,PRIMARY KEY(ID))
但产生同样的错误。
出于某种原因,在事务中创建数据库。我发现源代码负责,但我无法了解事务是如何启动的。我可以提供更详细的信息,但也许现在有人可以提供帮助了。
编辑:persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="h ttp://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="AntennasOperatingSystemServerPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<non-jta-data-source>MyDatabase</non-jta-data-source>
<class>... bunch of classes ... </class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="ALL"/>
<property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>
<property name="eclipselink.deploy-on-startup" value="true"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<property name="eclipselink.logging.level.sql" value="FINEST"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
<property name="eclipselink.target-database" value="PostgreSQL" />
</properties>
</persistence-unit>
</persistence>
答案 0 :(得分:0)
您是否尝试将eclipselink.target-database
属性设置为PostgreSQL
或org.eclipse.persistence.platform.database.PostgreSQLPlatform
?
如果上述问题无法解决问题,请分享您的persistence.xml文件。
答案 1 :(得分:0)
我前段时间做过类似的事情。以下配置运行良好。
<persistence-unit name="EjemploJpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url"
value="jdbc:derby://localhost:1527/example"/>
<property name="javax.persistence.jdbc.driver"
value="org.apache.derby.jdbc.ClientDriver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="123"/>
<property name="eclipselink.logging.level" value="ALL"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
显然,一旦创建了表格,就必须将属性eclipselink.ddl-generation
的值更改为none
。
注意:数据库是Derby,但我也尝试过使用MySQL。我认为它适用于PostgreSQL。