2015-05-11 5 views
8

Ich erstelle eine grundlegende Hibernate-Anwendung für Mitarbeiter-Tabelle, in der ich den Datensatz hinzufügen, aktualisieren, löschen und anzeigen die Hilfe der ManageEmployee-Klasse.Fehler: ORA-02289: Sequenz existiert nicht - org.hibernate.exception.SQLGrammarException: konnte ResultSet nicht extrahieren

Eigentlich ist ManageEmployee meine Testklasse und ich benutze Employee.java und Employee.hbm.xml Datei, um über Dinge zu gehen.

Details: Datenbank: Oracle 11 g Hibernate Version: hibernate-release-4.3.8.Final Java Version: Java 1.8

Mitarbeiter Tabelle Details:

BENUTZER_ID NUMBER (15,0) No 1 1
FIRST_NAME VARCHAR2 (20 Byte) Ja 2
LAST_NAME VARCHAR2 (20 Byte) Ja 3
GEHALT NUMBER (10,0) Ja 4

Fehlerprotokoll: Sie können in dem Protokoll sehen, dass der Fehler 3 mal kommt, weil ich das Employee Objekt 3 mal in der ManageEmployee.java Klasse mit der addEmployee (...) Methode hinzufüge, also gehe ich davon aus, dass das Problem mit dem Sequenzgenerator für die Spalten-ID

Hier verwende ich naiven Generator. i.g. Integer empID1 = ME.addMitarbeiter ("Zara", "Ali", 1000);

May 12, 2015 3:34:39 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
 
ERROR: ORA-02289: sequence does not exist 
 

 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
 
\t at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) 
 
\t at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
 
\t at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
 
\t at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
 
\t at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
 
\t at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:122) 
 
\t at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:115) 
 
\t at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
 
\t at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
 
\t at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
 
\t at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
 
\t at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
 
\t at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 
 
\t at ManageEmployee.addEmployee(ManageEmployee.java:47) 
 
\t at ManageEmployee.main(ManageEmployee.java:23) 
 
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist 
 

 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
 
\t at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059) 
 
\t at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522) 
 
\t at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) 
 
\t at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774) 
 
\t at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925) 
 
\t at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845) 
 
\t at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501) 
 
\t at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) 
 
\t ... 13 more 
 
May 12, 2015 3:34:39 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
 
WARN: SQL Error: 2289, SQLState: 42000 
 
May 12, 2015 3:34:39 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
 
ERROR: ORA-02289: sequence does not exist 
 

 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
 
\t at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) 
 
\t at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
 
\t at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
 
\t at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
 
\t at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
 
\t at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:122) 
 
\t at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:115) 
 
\t at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
 
\t at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
 
\t at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
 
\t at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
 
\t at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
 
\t at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 
 
\t at ManageEmployee.addEmployee(ManageEmployee.java:47) 
 
\t at ManageEmployee.main(ManageEmployee.java:24) 
 
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist 
 

 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
 
\t at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059) 
 
\t at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522) 
 
\t at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) 
 
\t at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774) 
 
\t at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925) 
 
\t at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845) 
 
\t at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501) 
 
\t at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) 
 
\t ... 13 more 
 
May 12, 2015 3:34:39 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
 
WARN: SQL Error: 2289, SQLState: 42000 
 
May 12, 2015 3:34:39 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
 
ERROR: ORA-02289: sequence does not exist 
 

 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
 
\t at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80) 
 
\t at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
 
\t at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 
 
\t at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 
 
\t at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91) 
 
\t at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:122) 
 
\t at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:115) 
 
\t at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
 
\t at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
 
\t at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
 
\t at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
 
\t at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
 
\t at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
 
\t at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 
 
\t at ManageEmployee.addEmployee(ManageEmployee.java:47) 
 
\t at ManageEmployee.main(ManageEmployee.java:25) 
 
Caused by: java.sql.SQLSyntaxErrorException: ORA-02289: sequence does not exist 
 

 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
 
\t at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
 
\t at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059) 
 
\t at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522) 
 
\t at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) 
 
\t at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53) 
 
\t at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774) 
 
\t at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925) 
 
\t at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798) 
 
\t at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845) 
 
\t at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501) 
 
\t at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82) 
 
\t ... 13 more 
 
First Name: a Last Name: b Salary: 2000

ManageEmployee.java Datei Code:

import java.util.List; 
 
import java.util.Date; 
 
import java.util.Iterator; 
 
    
 
import org.hibernate.HibernateException; 
 
import org.hibernate.Session; 
 
import org.hibernate.Transaction; 
 
import org.hibernate.SessionFactory; 
 
import org.hibernate.cfg.Configuration; 
 

 
public class ManageEmployee { 
 
    private static SessionFactory factory; 
 
    public static void main(String[] args) { 
 
     try{ 
 
     factory = new Configuration().configure().buildSessionFactory(); 
 
     }catch (Throwable ex) { 
 
     System.err.println("Failed to create sessionFactory object." + ex); 
 
     throw new ExceptionInInitializerError(ex); 
 
     } 
 
     ManageEmployee ME = new ManageEmployee(); 
 

 
     /* Add few employee records in database */ 
 
     Integer empID1 = ME.addEmployee("Zara", "Ali", 1000); 
 
     Integer empID2 = ME.addEmployee("Daisy", "Das", 5000); 
 
     Integer empID3 = ME.addEmployee("John", "Paul", 10000); 
 

 
     /* List down all the employees */ 
 
     ME.listEmployees(); 
 

 
     /* Update employee's records */ 
 
    // ME.updateEmployee(empID1, 5000); 
 

 
     /* Delete an employee from the database */ 
 
    // ME.deleteEmployee(empID2); 
 

 
     /* List down new list of the employees */ 
 
    // ME.listEmployees(); 
 
    } 
 
    /* Method to CREATE an employee in the database */ 
 
    public Integer addEmployee(String fname, String lname, int salary){ 
 
     Session session = factory.openSession(); 
 
     Transaction tx = null; 
 
     Integer employeeID = null; 
 
     try{ 
 
     tx = session.beginTransaction(); 
 
     Employee employee = new Employee(fname, lname, salary); 
 
     employeeID = (Integer) session.save(employee); 
 
     tx.commit(); 
 
     }catch (HibernateException e) { 
 
     if (tx!=null) tx.rollback(); 
 
     e.printStackTrace(); 
 
     }finally { 
 
     session.close(); 
 
     } 
 
     return employeeID; 
 
    } 
 
    /* Method to READ all the employees */ 
 
    public void listEmployees(){ 
 
     Session session = factory.openSession(); 
 
     Transaction tx = null; 
 
     try{ 
 
     tx = session.beginTransaction(); 
 
     List employees = session.createQuery("FROM Employee").list(); 
 
     for (Iterator iterator = 
 
          employees.iterator(); iterator.hasNext();){ 
 
      Employee employee = (Employee) iterator.next(); 
 
      System.out.print("First Name: " + employee.getFirstName()); 
 
      System.out.print(" Last Name: " + employee.getLastName()); 
 
      System.out.println(" Salary: " + employee.getSalary()); 
 
     } 
 
     tx.commit(); 
 
     }catch (HibernateException e) { 
 
     if (tx!=null) tx.rollback(); 
 
     e.printStackTrace(); 
 
     }finally { 
 
     session.close(); 
 
     } 
 
    } 
 
    /* Method to UPDATE salary for an employee */ 
 
    public void updateEmployee(Integer EmployeeID, int salary){ 
 
     Session session = factory.openSession(); 
 
     Transaction tx = null; 
 
     try{ 
 
     tx = session.beginTransaction(); 
 
     Employee employee = 
 
        (Employee)session.get(Employee.class, EmployeeID); 
 
     employee.setSalary(salary); 
 
\t \t session.update(employee); 
 
     tx.commit(); 
 
     }catch (HibernateException e) { 
 
     if (tx!=null) tx.rollback(); 
 
     e.printStackTrace(); 
 
     }finally { 
 
     session.close(); 
 
     } 
 
    } 
 
    /* Method to DELETE an employee from the records */ 
 
    public void deleteEmployee(Integer EmployeeID){ 
 
     Session session = factory.openSession(); 
 
     Transaction tx = null; 
 
     try{ 
 
     tx = session.beginTransaction(); 
 
     Employee employee = 
 
        (Employee)session.get(Employee.class, EmployeeID); 
 
     session.delete(employee); 
 
     tx.commit(); 
 
     }catch (HibernateException e) { 
 
     if (tx!=null) tx.rollback(); 
 
     e.printStackTrace(); 
 
     }finally { 
 
     session.close(); 
 
     } 
 
    } 
 
}

Mapping-Datei:

<?xml version="1.0" encoding="utf-8"?> 
 
<!DOCTYPE hibernate-mapping PUBLIC 
 
"-//Hibernate/Hibernate Mapping DTD//EN" 
 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
 

 
<hibernate-mapping> 
 
    <class name="Employee" table="EMPLOYEE"> 
 
     <meta attribute="class-description"> 
 
     This class contains the employee detail. 
 
     </meta> 
 
     <id name="user_id" type="int" column="user_id"> 
 
     <generator class="native"/> 
 
     </id> 
 
     <property name="firstName" column="first_name" type="string"/> 
 
     <property name="lastName" column="last_name" type="string"/> 
 
     <property name="salary" column="salary" type="int"/> 
 
    </class> 
 
</hibernate-mapping>

public class Employee { 
 
    
 
    private int user_id; 
 
    private String firstName; 
 
    private String lastName; 
 
    private int salary; 
 

 
    public Employee() {} 
 
    public Employee(String fname, String lname, int salary) { 
 
     this.firstName = fname; 
 
     this.lastName = lname; 
 
     this.salary = salary; 
 
    } 
 
    
 
    public String getFirstName() { 
 
     return firstName; 
 
    } 
 
    public void setFirstName(String first_name) { 
 
     this.firstName = first_name; 
 
    } 
 
    public String getLastName() { 
 
     return lastName; 
 
    } 
 
    public void setLastName(String last_name) { 
 
     this.lastName = last_name; 
 
    } 
 
    public int getSalary() { 
 
     return salary; 
 
    } 
 
    public void setSalary(int salary) { 
 
     this.salary = salary; 
 
    } 
 
public int getUser_id() { 
 
\t return user_id; 
 
} 
 
public void setUser_id(int user_id) { 
 
\t this.user_id = user_id; 
 
} 
 
}

+0

Zeigen Sie die Klasse Employee bitte; Dieser Fehler tritt beim Einfügen einer neuen ID/Zeile in eine Tabelle auf, und Sie haben keine Sequenz in der Modellklasse (Employee) erstellt. Daher kann Hibernate die neue Zeile nicht erstellen, da sie die einzufügende ID nicht kennt. – Asura

+0

Es sieht so aus als ob '' erwartet, dass eine Sequenz erstellt wird, schauen Sie sich vielleicht die Dokumente an, was die Oracle-Implementierung welcher "nativen" Generation in diesem Fall macht? – BretC

+0

@Asura Ich habe die Frage bearbeiten. die letzte ist Mitarbeiterklasse – user2682305

Antwort

5

Klasse Employee fehlt ein Sequenz-Generator kann so Ruhezustand nicht die Zeile einzufügen. es so etwas wie dies sein sollte, die die ID Zählspalte um 1 erhöhen:

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCE1") 
@SequenceGenerator(name="SEQUENCE1", sequenceName="SEQUENCE1", allocationSize=1) 
private int user_id; 
+0

Danach müssen wir auch die Generatorklasse ändern? Ich meine "native" zu "Sequenz" – user2682305

+0

die Art, wie ich gepostet wurde war mit Frühling Annotation meine Entschuldigung Sie tun das Mapping mit einer XML-Datei.Der Grund, warum Sie diesen Fehler in Ihrer XML-Datei erhalten, ist, weil erwartet einen Namen für die Sequenz, sonst versucht es es selbst, es sei denn, die Konfigurationsdatei ist korrekt eingestellt. Der Name sollte der Name sein, den Sie der Sequenz in Ihrer Datenbank gegeben haben. http://www.java4s.com/hibernate/generators -in-hibernate/ – Asura

+0

Ich hatte bei diesen exakten Zeilen immer noch den gleichen Fehler. –

4

nach auf Oracle sequences lesen und wie sie funktionieren, sowie telling Hibernate that you are using a SEQUENCE (Abschnitt 5.1.2.2.4), anstatt ein nativen Generator Ich habe meine Fehler behoben.

Ich habe eine Sequenz in Oracle-Datenbank durch die folgende Abfrage erstellt und aktualisiert meine hbm.XML-Datei

CREATE SEQUENCE TAB_CUSTOMER_SEQ 
 
START WITH 1 
 
MAXVALUE 999999999999999999999999999 
 
MINVALUE 1 
 
NOCYCLE 
 
CACHE 20 
 
NOORDER;

<id name="user_id" type="int" column="user_id"> 
 
      <generator class="sequence"> 
 
      <param name="sequence">TAB_CUSTOMER_SEQ</param> 
 
      </generator>   
 
     </id>

+1

Ich dachte, Sie wollten die Sequenz in Java erstellen. –

Verwandte Themen