使用JPA在Apache Derby中创建表的SQLSyntaxErrorException

时间:2013-03-06 13:02:43

标签: eclipselink derby

我正在使用Eclipselink作为JPA提供程序和嵌入式Apache Derby数据库。当我运行项目时,我得到如下异常:

  

内部异常:java.sql.SQLSyntaxErrorException:语法错误:   在第1栏第31栏遇到“不”。

     

错误代码:-1

     

调用:CREATE TABLE ITEM(ID VARCHAR NOT NULL,CODE VARCHAR,EXCLUSIVETAX   NUMBER(10,5),NAME VARCHAR,UNITPRICE NUMBER(10,5),PRIMARY KEY(ID))

     

查询:DataModifyQuery(sql =“CREATE TABLE ITEM(ID VARCHAR NOT NULL,   CODE VARCHAR,EXCLUSIVETAX NUMBER(10,5),NAME VARCHAR,UNITPRICE   NUMBER(10,5),PRIMARY KEY(ID))“)

     

[EL警告]:2013-03-06   18:04:41.827 - ServerSession(1650627452) - 异常[EclipseLink-4002]   (Eclipse Persistence Services - 2.3.2.v20111125-r10461):   org.eclipse.persistence.exceptions.DatabaseException

     

内部异常:java.sql.SQLSyntaxErrorException:语法错误:遇到   “(”第1栏第71栏。

     

错误代码:-1

     

调用:CREATE TABLE SEQUENCE(SEQ_NAME VARCHAR(50)NOT NULL,SEQ_COUNT NUMBER(19),PRIMARY KEY(SEQ_NAME))

     

查询:DataModifyQuery(sql =“CREATE TABLE SEQUENCE(SEQ_NAME VARCHAR(50)NOT NULL,SEQ_COUNT NUMBER(19),PRIMARY KEY(SEQ_NAME))”)

     

[EL Info]:2013-03-06   18:04:41.856 - ServerSession(1650627452) - 通信失败   在尝试执行读取查询时检测到   交易。试图重试查询。错误是:异常   [EclipseLink-4002](Eclipse持久性服务 -   2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DatabaseException

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="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="StockKeeperPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>com.mycompany.entities.stock.Item</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:sampledb;create=true"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

这是什么问题?该声明中不允许NOT吗?如果不允许,为什么查询被框起来了呢?

2 个答案:

答案 0 :(得分:3)

这是因为Eclipse Link在不知道数据库的情况下生成查询,因此它们生成大多数DBMS通用的查询。但是,正如@Bryan所说,Derby没有NUMBER数据类型。

为了避免这种情况,我们需要通过在persistance.xml中添加它来告诉我们使用哪个数据库。

  <property name="eclipselink.target-database" value="Derby"/>

还将平台类名称添加为

<property name="eclipselink.platform.class.name" value="org.eclipse.persistence.platform.database.DerbyPlatform"/>

答案 1 :(得分:1)

Derby没有NUMBER数据类型。以下是Derby的数据类型:http://db.apache.org/derby/docs/10.9/ref/crefsqlj31068.html#crefsqlj31068

也许你想要的是DECIMAL而不是NUMBER。