【问题标题】:JPA/EclipseLink Error in Creating Tables创建表时出现 JPA/EclipseLink 错误
【发布时间】:2017-09-02 21:27:45
【问题描述】:

我正在尝试使用 EclipseLink 创建一个表。正在使用的 java 类是:-

import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Id;

@Entity
public class Submissions {

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long Id;
 private String XID;
 private String Y;
 @Temporal(TemporalType.DATE)
 private Date uDate;
 private String level;
 private String state;

 public Submissions() {
 }

 //All Relevant getter and setter functions
}

有问题的相关持久化xml如下:-

<persistence-unit name="SubmissionIds">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>com.obp.selenium.DataObjects.OriginationSubmissions</class>
    <properties>

        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
        <property name="javax.persistence.jdbc.url"
            value="jdbc:oracle:thin:@localhost:1521:orcl" />
        <property name="javax.persistence.jdbc.user" value="------" />
        <property name="javax.persistence.jdbc.password" value="------" />

        <!-- EclipseLink should create the database schema automatically -->
        <property name="eclipselink.ddl-generation" value="create-tables" />
        <property name="eclipselink.ddl-generation.output-mode"
            value="database" />
        <!-- <property name="eclipselink.canonicalmodel.subpackage"
            value="originationSubmissions" /> -->
    </properties>
</persistence-unit>

我们使用标准方法是将 EntityManagerFactory 实现为:-

EntityManagerFactory factory = Persistence.createEntityManagerFactory("SubmissionIds");
    EntityManager em = factory.createEntityManager();
    em.getTransaction().begin();
    em.getTransaction().commit();
    em.close();

但是我不断收到以下错误:-

EL 警告]:2017-04-07 14:04:53.768--ServerSession(1650327539)--异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence .exceptions.DatabaseException 内部异常:java.sql.SQLSyntaxErrorException:ORA-00904::无效标识符

错误代码:904 调用: CREATE TABLE SUBMISSIONS (ID NUMBER(19) NOT NULL, XID VARCHAR2(255) NULL, Y VARCHAR2(255) NULL, LEVEL VARCHAR2(255) NULL, STATE VARCHAR2(255) NULL, UDATE DATE NULL, PRIMARY KEY (ID )) 查询: DataModifyQuery(sql="CREATE TABLE SUBMISSIONS (ID NUMBER(19) NOT NULL, XID VARCHAR2(255) NULL, Y VARCHAR2(255) NULL, LEVEL VARCHAR2(255) NULL, STATE VARCHAR2(255) NULL, UDATE DATE NULL , 主键 (ID))")

【问题讨论】:

  • 在您的 persistence.xml 中没有名为 "Trainstops" 的持久性单元,您正在尝试在此处实例化:Persistence.createEntityManagerFactory("Trainstops")。持久性单元称为SubmissionIds,此PU 映射的实体称为OriginationSubmissions 而不是Submissions。您应该检查持久性单元名称和类名称是否正确。
  • “LEVEL”是保留字,不能用作列名。将列注释添加到您的级别属性并在表中将其命名为其他名称以使其正常工作,或者只是为该属性指定一个不同的名称。
  • @dic19 - 将实体名称从 TrainStops 更改为 SubmissionIds。错误仍然存​​在。

标签: java jpa eclipselink


【解决方案1】:

实际上 Eclipse 报告了一个错误,当使用保留字时会出现错误,您可以在这里解决问题:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=260637

问题来自使用保留字我实际上并不知道您的 DBMS,如果它是 Mysql 您的属性 XIDLEVEL 是保留字。您可以在此处找到 mysql 保留字: https://dev.mysql.com/doc/refman/5.7/en/keywords.html.

您还可以从用于构建您的表的 sql 代码中看出有一个 DATE 类型的列名更新

更新日期为空

所以在我看来,您还需要在 uDate 上查看您的属性名称

【讨论】:

    【解决方案2】:

    问题在于名为 Field 的 LEVEL。 @Chris 在评论中提出了正确的答案。 “LEVEL”是保留字,不能用作列名。将列注释添加到您的级别属性并在表中将其命名为其他名称以使其正常工作,或者只是为属性指定一个不同的名称。

    更改字段名称很容易。

    【讨论】:

    • 其实它可以用作列名,但你需要引用它。其他 JPA 提供商会为您执行此操作,但您的似乎没有
    • @Neil 是的,你是对的。但是不使用保留字不是更好吗?
    • 最好不要被持久化提供者强加给软件用户...恕我直言
    • 我只是想说,我在 EclipseLink 和 Hibernate 中都使用保留字作为列名(即:“status”)或表名(即:“user”),完全没有问题.如果它作为一种常见做法有任何不同,我总是在指定列名的字段上使用@Column 注释,即使它与字段名匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多