2015-05-11 7 views
8

Sto creando un'applicazione di ibernazione di base per la tabella dei dipendenti in cui sto aggiungendo, aggiornando, eliminando e visualizzando il record con l'aiuto della classe ManageEmployee.ERRORE: ORA-02289: la sequenza non esiste - org.hibernate.exception.SQLGrammarException: impossibile estrarre ResultSet

In realtà, ManageEmployee è la mia classe di test e sto utilizzando il file Employee.java e Employee.hbm.xml per fare sopra le cose.

Dettagli: di database: Oracle 11 g versione Hibernate: hibernate-release-4.3.8.Final Java Version: Java 1.8

Impiegato Tabella Dettagli:

USER_ID NUMERO (15,0) No 1 1
FIRST_NAME VARCHAR2 (20 BYTE) Sì 2
LAST_NAME VARCHAR2 (20 BYTE) Sì 3
STIPENDIO NUMERO (10,0) Sì 4

Registro errori: è possibile vedere nel registro che l'errore è in arrivo 3 volte perché sto aggiungendo l'oggetto Employee 3 volte nella classe ManageEmployee.java con il metodo addEmployee (...) quindi presumo che il problema sia con il generatore di sequenze per colonna id.

Qui sto usando il generatore naive. , ad es. Numero intero empID1 = ME.addEmployee ("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

file Codice ManageEmployee.java:

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

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

Mostra alla classe Employee prega; questo errore si verifica quando si inserisce un nuovo ID/riga nella tabella e non è stata creata una sequenza nella classe del modello (Dipendente), quindi la sospensione non può creare la nuova riga perché non conosce l'ID da inserire. – Asura

+0

Sembra che '' si aspetti che venga creata una sequenza, magari guardate i documenti riguardo a quale implementazione Oracle di quale generazione "nativa" fa in questa circostanza? – BretC

+0

@Asura ho modificato la domanda. l'ultimo è la classe Employee – user2682305

risposta

5

classe Employee manca un generatore sequenza in modo Sospensione non può inserire la riga. dovrebbe essere qualcosa di simile che aumentano la colonna conteggio id da 1:

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

, quindi è necessario cambiare anche la classe del generatore? Voglio dire "nativo" a "sequenza" – user2682305

+0

il modo in cui ho postato era con l'annotazione di primavera le mie scuse si sta facendo il mapping utilizzando un file xml. Il motivo per cui si ottiene questo errore nel file xml è perché si aspetta un nome per la sequenza altrimenti tenta di farlo da solo a meno che il file di configurazione non sia impostato correttamente. Il nome dovrebbe essere il nome che hai dato alla sequenza nel Database.http: //www.java4s.com/hibernate/generators -in-hibernate/ – Asura

+0

Ho avuto quelle stesse righe ancora lo stesso errore. –

4

dopo leggere su Oracle sequences e il loro funzionamento, così come telling Hibernate that you are using a SEQUENCE (sezione 5.1.2.2.4), piuttosto che un generatore nativo , Ho corretto i miei errori.

Ho creato una sequenza nel database Oracle tramite la query seguente e aggiornato my hbm.file xml

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

Ho pensato che volessi creare la sequenza in Java. –

Problemi correlati