【问题标题】:Embedded Glassfish SQL statement fail嵌入式 Glassfish SQL 语句失败
【发布时间】:2012-07-02 05:32:22
【问题描述】:

我开发了一些单元测试,但所有 SQL 语句都失败了,你能看看这个日志和配置吗?

2012 年 7 月 1 日下午 4:33:05 org.glassfish.persistence.common.Java2DBProcessorHelper 执行 DDL 警告:PER01000:得到 SQLException 执行语句“CREATE TABLE CAR(ID BIGINT NOT NULL,BRAND VARCHAR(255) NOT NULL,说明 VARCHAR(255)、FUEL VARCHAR(255) NOT NU\ LL、齿轮箱 VARCHAR(255) NOT NULL, KILOMETERS INTEGER NOT NULL, MODEL VARCHAR(255) NOT NULL, PRICE 整数非空,类型 VARCHAR(255) 非空,年整数非空, EQUIPM\ ENT_ID BIGINT、SECURITY_ID BIGINT、主密钥 (ID))": java.sql.SQLSyntaxErrorException:语法错误:遇到“YEAR” 第 1 行,第 263 列。2012 年 7 月 1 日下午 4:33:05 org.glassfish.persistence.common.Java2DBProcessorHelper 执行 DDL 警告:PER01000:得到 SQLException 执行语句“CREATE TABLE 车辆(ID BIGINT NOT NULL,MAKE VARCHAR(255) NOT NULL,型号 VARCHAR(255) NOT NULL,TRIM VARCHAR(255) \ NOT NULL,YEAR INTEGER NOT NULL,主键(ID))“:java.sql.SQLSyntaxErrorException:语法 错误:在第 1 行第 100 列遇到“TRIM”。2012 年 7 月 1 日 4:33:06 PM org.glassfish.persistence.common.Java2DBProcessorHelper executeDDLs 警告:PER01000:得到 SQLException 执行语句“ALTER TABLE CAR ADD CONSTRAINT FK_CAR_SECURITY_ID FOREIGN KEY (SECURITY_ID) 参考安全(ID)“:java.sql.SQLSy\ ntaxErrorException:'ALTER TABLE' 不能在 'CAR' 上执行,因为它不存在。 7月1日, 2012 下午 4:33:06 org.glassfish.persistence.common.Java2DBProcessorHelper 执行 DDL 警告:PER01000:得到 SQLException 执行语句“ALTER TABLE CAR ADD CONSTRAINT CAR_EQUIPMENT_ID FOREIGN KEY (EQUIPMENT_ID) 参考设备 (ID)": java.sql.SQLSy\ ntaxErrorException: 'ALTER TABLE' 不能在 'CAR' 上执行,因为它不存在。 7月1日, 2012 下午 4:33:06 com.sun.ejb.containers.BaseContainer initializeHome 信息:EJB5181:EJB VehicleEJB 的可移植 JNDI 名称: [java:global/classes/VehicleEJB!com.thevehiclelist.VehicleEJB, java:global/classes/VehicleEJB] 2012 年 7 月 1 日下午 4:33:06 com.sun.ejb.containers.BaseContainer initializeHome 信息: EJB5181:EJB BookEJB 的可移植 JNDI 名称: [java:global/classes/BookEJB!se.while_se.BookEJB, java:global/classes/BookEJB] 2012 年 7 月 1 日下午 4:33:06 com.sun.ejb.containers.BaseContainer initializeHome 信息: EJB5181:EJB CarEJB 的可移植 JNDI 名称: [java:global/classes/CarEJB, java:global/classes/CarEJB!se.while_se.CarEJB] 2012 年 7 月 1 日下午 4:33:07 org.eclipse.persistence.session.file:/tmp/gfembed468260415984552053tmp/applications/classes/_carcmsPU 警告:本地异常堆栈:异常 [EclipseLink-4002] (Eclipse 持久性服务 - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException 内部 异常:java.sql.SQLSyntaxErrorException:语法错误:遇到 “TRIM”在第 1 行第 39 列。错误代码:20000 调用:INSERT INTO 车辆(ID、品牌、型号、装饰、年份)值(?、?、?、?、?) bind => [5 个参数绑定] 查询:InsertObjectQuery(Vehicle [id=1, year=2007, make=Volvo, model=V70, trim=2.4D]) 在 org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333) 在 org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644) 在 org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535) 在 org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1717) 在 org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253) 在 org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207) 在 org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193) 在 org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:342) 在 org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:162) 在 org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:177) 在 org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:472) 在 org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) 在 org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) 在 org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:287) 在 org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) 在 org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:844) 在 org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:743) 在 org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) 在 org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) 在 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871)

我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
    version="2.0">

    <persistence-unit name="carcmsPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/__default</jta-data-source>

        <class>se.while_se.Book</class>
        <class>se.while_se.Car</class>
        <class>com.thevehiclelist.Vehicle</class>



        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:derby:MyTestDb;create=true" />
            <property name="javax.persistence.jdbc.user" value="" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />

        </properties>
    </persistence-unit>
</persistence>

还有我的 pom.xml

<dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.8.1</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.eclipse.persistence</groupId>
                    <artifactId>javax.persistence</artifactId>
                    <version>2.0.0</version>
                </dependency>
                <dependency>
                    <groupId>org.eclipse.persistence</groupId>
                    <artifactId>eclipselink</artifactId>
                    <version>2.3.2</version>
                </dependency>
                <dependency>
                    <groupId>org.glassfish.main.extras</groupId>
                    <artifactId>glassfish-embedded-all</artifactId>
                    <version>3.1.2</version>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.derby</groupId>
                    <artifactId>derby</artifactId>
                    <version>10.8.2.2</version>
                    <scope>provided</scope>
                </dependency>

            </dependencies>

我不知道它可能是什么,尝试了很多次谷歌搜索,但没有找到任何参考代码。请您看看我的配置有什么问题或建议我获取一些文档吗?

最好的问候

【问题讨论】:

  • 年份看起来像 Oscar 一个保留字。在您的 create table 语句中,尝试将 year 更改为 caryear 甚至是 years,然后再试一次。

标签: jpa glassfish derby


【解决方案1】:

第一个错误是您尝试创建一个名为 YEAR 的列,但 YEAR 是 Derby 中的保留字。您应该选择另一个列名。第二个是您尝试创建一个 TRIM 列,也是一个保留字。这里还要选择另一个列名。

据我所知,其余错误是由创建第一个表期间的失败引起的。

首先手动创建表并使用您的 IDE 创建相应的持久性类可能更容易且不易出错(Netbeans 使这非常容易,我假设其他 IDE 具有类似的功能)。

还有一件事:为了避免自动创建 255 个字符宽的 varchar 列,您可以在注释中添加所需的长度。在那里,您还可以修复数据库列名。例如,在 db 中有一个 32 字符宽的非空列称为内部修剪,但在代码中修剪:

@Column(name = "INTERIORTRIM", nullable = false, length=32)
private String trim;

【讨论】:

  • 我自己发现了它,我非常依赖 Eclipse IDE lint checker.. 不应该这样做。 。谢谢! =)
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2017-07-22
  • 2011-06-01
相关资源
最近更新 更多