2013-11-12 2 views
0

Две проблемы - Если я запрашиваю сущность, я получаю ...SQLGrammarException с Hibernate и Oracle11g

ERROR: ORA-00933: SQL command not properly ended 

Nov 11, 2013 8:47:36 PM org.hibernate.event.internal.DefaultLoadEventListener onLoad 
INFO: HHH000327: Error performing load command : org.hibernate.exception.SQLGrammarException: could not extract ResultSet 

При попытке вставить объект, я получаю ...

Hibernate: insert into MyDB.dbo.BOSS_CONTACTS_C_LVL (CNTCT_PHN_NBR, CVM_CNTCT_EMAIL, DTID, BUSINESS_NAME, CONTACT_NAME, FIRST_NAME, LAST_NAME, PHONE_NUMBER, CONTACT_TITLE, EMPLOYEES_HERE, REGION, AREA, BRANCH_NAME, BRANCH_ID, IN_OUTBOUND, PROSPECT_TYPE, RATING, DUNS_NUMBER, ADDRESS, CITY, STATE, ZIP, LOCAL_STREET, LOCAL_CITY, LOCAL_STATE_PROVINCE, LOCAL_ZIP_POSTAL_CODE, HANDSET_POTENTIAL, CAMPAIGN_NAME, CAMPAIGN_CODE, ASSIGNED_REP, TOTAL_TELECOM, PROFILE_ID, BUSINESS_ID, KEYCODE, SIC, CVM_UNQ_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
Nov 11, 2013 9:00:53 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 926, SQLState: 42000 
Nov 11, 2013 9:00:53 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: ORA-00926: missing VALUES keyword 

Я пробовал несколько разных драйверов Oracle, думая, что это может быть проблемой. Я также прочитал сообщение где-то, что одно из имен полей может быть ключевым словом Oracle, но я удалил все поля, но первичный ключ для проверки, и ошибка все еще происходит.

hibernate.cfg -

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <property name="show_sql">true</property> 
    <property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property> 
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
    <property name="hibernate.connection.password">oasisd_02</property> 
    <property name="hibernate.connection.url">jdbc:oracle:thin:@MyServer:1521/MyDB</property> 
    <property name="hibernate.connection.username">sa</property> 
    <property name="hibernate.default_catalog">MyDB</property> 
    <property name="hibernate.default_schema">dbo</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> 
    <mapping class="myPrj.domain.Contact" resource="myPrj/domain/Contact.hbm.xml"/> 
</session-factory> 
</hibernate-configuration> 

Файл отображения генерируется из JBOSS Tools в Eclipse.

Кроме того, я попытался JDK 1.6 и 1,7

Обновлено - Я хотел бы добавить, что я не использую запрос пользовательских HQL.

Использование хранилища шаблона -

public class ContactRepository implements IContactRepository { 

    public Contact find(String cvmUnqId) { 
     Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
     session.beginTransaction(); 
     Contact aContact = (Contact) session.load(Contact.class, cvmUnqId); 
     return aContact; 
    } 

    public Contact findByZipCode(String zipcode) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void store(Contact contact) { 
     Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
     session.beginTransaction(); 
     session.save(contact); 
     session.getTransaction().commit(); 
    } 

    public void remove(Contact contact) 
    { 
     Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
     session.beginTransaction(); 
     session.delete(contact); 
     session.getTransaction().commit(); 
    } 

} 

И тестовый случая -

@Test 
public void testContactList(){ 
    ContactRepository contactRepo = new ContactRepository(); 
    Object result = contactRepo.find("FakeID"); 
    assertEquals(result, null); 
} 

@Test 
public void addRemoveContactTest() { 
    ContactRepository contactRepo = new ContactRepository(); 

    Contact contact = new Contact(); 
    contact.setAddress("123 Anywhere"); 
    contact.setArea('A'); 
    contact.setAssignedRep('B'); 
    contact.setBranchId('C'); 
    contact.setBranchName('D'); 
    contact.setBusinessId("Business ID"); 
    contact.setBusinessName("Fake Business"); 
    contact.setZip("11111"); 
    contact.setCvmUnqId("FakeID"); 
    contactRepo.store(contact); 

    Contact foundContact = contactRepo.find(contact.getCvmUnqId()); 
    assertEquals("Contact was not found in repository", contact, foundContact); 

    contactRepo.remove(contact); 
    foundContact = contactRepo.find(contact.getCvmUnqId()); 
    assertEquals("Contact was not removed from repository", null, foundContact); 
} 

и утилиты фабрики в случае то отношения -

public class HibernateUtil { 

    private static SessionFactory sessionFactory = configureSessionFactory(); 
    private static ServiceRegistry serviceRegistry; 

    private static SessionFactory configureSessionFactory() throws HibernateException { 
     Configuration configuration = new Configuration(); 
     configuration.configure(); 
     serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();   
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
     return sessionFactory; 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

} 

Проблема решена. Идентификатор таблицы из нескольких частей был неправильным. Я удалил свойство каталога по умолчанию из конфигурации hibernate, и теперь он отлично работает. Я удивлен, что это не было лучшим сообщением об ошибке от Oracle. Что-то вроде «таблицы не существует» ...

+0

SQLGrammarException - главным образом из-за недопустимого sql. Проверьте строку запроса – nayakam

ответ

1

Проблема решена. Идентификатор таблицы из нескольких частей был неправильным. Я удалил свойство каталога по умолчанию из конфигурации hibernate, и теперь он отлично работает. Я удивлен, что это не было лучшим сообщением об ошибке от Oracle. Что-то вроде «таблицы не существует» ...

1

Самый простой способ выяснить, какой оператор вызывает ошибки oracle, - это связать сеанс с базой данных и включить трассировку sql или включить трассировку события 10046.

включить трассировку, используйте альтер сеансовых sql_trace = True

включить 10046 кальки '10046 трассировки контекста имени навсегда, уровня 12' один Alter сеансовых событий;

10046 также может быть передан dba для других сеансов базы данных.

Затем запустите рабочую нагрузку и проанализируйте соответствующий файл трассировки. Файлы трассировки создаются в каталоге, указанном параметром init.ora user_dump_dest.

Смежные вопросы