0
votes

I am trying to create a table using EclipseLink. The java class being used is :-

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
}

The relevant persistence xml in question is as follows:-

<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>

We use the standard method is by implementing the EntityManagerFactory as :-

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

However I keep getting the following errors :-

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))")

2
In your persistence.xml there is not persistence unit called "Trainstops" which is you're trying to instantiate here: Persistence.createEntityManagerFactory("Trainstops"). The persistence unit is called SubmissionIds and the entity this PU maps is called OriginationSubmissions not Submissions. You should check both persistence unit name and class name are the right ones.dic19
"LEVEL" is a reserved word and cannot be used as a column name. Add the column annotation to your level attribute and name it something else in the table for this to work, or just give the attribute a different name.Chris
@dic19 - Changed the entity name from TrainStops to SubmissionIds. Still the error persists.Sourajyoti Bose

2 Answers

1
votes

Avtually Eclipse reported a bug that rises when there is a reserved word usage you can fine here :
https://bugs.eclipse.org/bugs/show_bug.cgi?id=260637.

the problem comes from using a reserved word I dont actually know your DBMS, if it is Mysql your attributs XID and LEVEL is a reserved word. you can find mysql reserved word here : https://dev.mysql.com/doc/refman/5.7/en/keywords.html.

You can also se from the sql code used to build your tables that there is a column name update of type DATE

UDATE DATE NULL

So to my opinion, you also need watch your attribut name on uDate

0
votes

The problem lay in the LEVEL named Field. @Chris has suggested the correct answer in the comment. "LEVEL" is a reserved word and cannot be used as a column name. Add the column annotation to your level attribute and name it something else in the table for this to work, or just give the attribute a different name.

Changing the field name worked easily.