JPA/EclipseLink 创建表时出错
JPA/EclipseLink Error in Creating Tables
我正在尝试使用 EclipseLink 创建 table。使用的 java class 是:-
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 Warning]: 2017-04-07 14:04:53.768--ServerSession(1650327539)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: : invalid identifier
Error Code: 904
Call: 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))
Query: 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, PRIMARY KEY (ID))")
问题出在名为 Field 的 LEVEL 中。 @Chris 在评论中提出了正确答案。 "LEVEL"是保留字,不能作为列名使用。将列注释添加到您的级别属性并在 table 中将其命名为其他名称以使其起作用,或者只为该属性指定一个不同的名称。
更改字段名称很容易。
实际上,Eclipse 报告了一个错误,该错误会在使用保留字时出现,您可以在此处解决:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=260637.
问题来自于使用保留字 我实际上并不知道你的 DBMS,如果它是 Mysql 你的属性
XID 和 级别
是一个保留字。你可以在这里找到 mysql 保留字:
https://dev.mysql.com/doc/refman/5.7/en/keywords.html.
您还可以从用于构建表的 sql 代码中看到有一个 DATE
类型的列名称更新
UDATE DATE NULL
所以在我看来,你还需要在 uDate 上注意你的属性名称
这通常是由于将关键字用作列或 table 名称。
对于列,您可以使用 @Column(name = "new_name_with_keywords")
我正在尝试使用 EclipseLink 创建 table。使用的 java class 是:-
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 Warning]: 2017-04-07 14:04:53.768--ServerSession(1650327539)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: : invalid identifier
Error Code: 904 Call: 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)) Query: 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, PRIMARY KEY (ID))")
问题出在名为 Field 的 LEVEL 中。 @Chris 在评论中提出了正确答案。 "LEVEL"是保留字,不能作为列名使用。将列注释添加到您的级别属性并在 table 中将其命名为其他名称以使其起作用,或者只为该属性指定一个不同的名称。
更改字段名称很容易。
实际上,Eclipse 报告了一个错误,该错误会在使用保留字时出现,您可以在此处解决:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=260637.
问题来自于使用保留字 我实际上并不知道你的 DBMS,如果它是 Mysql 你的属性 XID 和 级别 是一个保留字。你可以在这里找到 mysql 保留字: https://dev.mysql.com/doc/refman/5.7/en/keywords.html.
您还可以从用于构建表的 sql 代码中看到有一个 DATE
类型的列名称更新UDATE DATE NULL
所以在我看来,你还需要在 uDate 上注意你的属性名称
这通常是由于将关键字用作列或 table 名称。
对于列,您可以使用 @Column(name = "new_name_with_keywords")