0

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

2012 年 7 月 1 日下午 4:33:05 org.glassfish.persistence.common.Java2DBProcessorHelper executeDDLs 警告:PER01000:得到 SQLException 执行语句“CREATE TABLE CAR (ID BIGINT NOT NULL, BRAND VARCHAR(255) NOT NULL, DESCRIPTION VARCHAR(255 )、FUEL VARCHAR(255) NOT NU\ LL、GEARBOX VARCHAR(255) NOT NULL、KILOMETERS INTEGER NOT NULL、MODEL VARCHAR(255) NOT NULL、PRICE INTEGER NOT NULL、TYPE VARCHAR(255) NOT NULL、YEAR INTEGER NOT NULL , EQUIPM\ ENT_ID BIGINT, SECURITY_ID BIGINT, PRIMARY KEY (ID))”:java.sql.SQLSyntaxErrorException:语法错误:在第 1 行第 263 列遇到“YEAR”。2012 年 7 月 1 日下午 4:33:05 org.glassfish .persistence.common.Java2DBProcessorHelper executeDDLs WARNING: PER01000: Got SQLException execution statement "CREATE TABLE VEHICLE (ID BIGINT NOT NULL, MAKE VARCHAR(255) NOT NULL,MODEL VARCHAR(255) NOT NULL, TRIM VARCHAR(255) \ NOT NULL, YEAR INTEGER NOT NULL, PRIMARY KEY (ID))”:java.sql.SQLSyntaxErrorException:语法错误:在第 1 行第 100 列遇到“TRIM”。 2012 年 7 月 1 日下午 4:33:06 org.glassfish.persistence.common.Java2DBProcessorHelper executeDDLs 警告:PER01000:得到 SQLException 执行语句“ALTER TABLE CAR ADD CONSTRAINT FK_CAR_SECURITY_ID FOREIGN KEY (SECURITY_ID) REFERENCES SECURITY (ID)”:java.sql .SQLSy\ ntaxErrorException: 'ALTER TABLE' 不能在 'CAR' 上执行,因为它不存在。2012 年 7 月 1 日下午 4:33:06 org.glassfish.persistence.common.Java2DBProcessorHelper executeDDLs 警告:PER01000:得到 SQLException 执行语句"ALTER TABLE CAR ADD CONSTRAINT CAR_EQUIPMENT_ID FOREIGN KEY (EQUIPMENT_ID) REFERENCES EQUIPMENT (ID)": java.sql.SQLSy\ ntaxErrorException: 'ALTER TABLE' 不能在 'CAR' 上执行,因为它不存在。2012 年 7 月 1 日 4:33 :06 PM com.sun.ejb.containers.BaseContainer initializeHome 信息:EJB5181:EJB VehicleEJB 的可移植 JNDI 名称:[java:global/classes/VehicleEJB!com.thevehiclelist.VehicleEJB, java:global/classes/VehicleEJB] 7 月 1 日, 2012 下午 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 Persistence Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLSyntaxErrorException:语法错误:在第 1 行第 39 列遇到“TRIM”。错误代码:20000 调用:INSERT INTO VEHICLE (ID, MAKE, MODEL, TRIM, YEAR) VALUES (?, ?, ?, ?, ?) 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。query.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。在 org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) 在 org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:743) 执行(DatabaseQuery.java:844) .persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) 在 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871)executeInUnitOfWork(ObjectLevelModifyQuery.java:85) 在 org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871)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>

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

最好的问候

4

1 回答 1

2

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

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

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

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

@Column(name = "INTERIORTRIM", nullable = false, length=32)
private String trim;
于 2012-07-01T14:52:33.273 回答