2010-11-24 2 views
1

Я хочу, чтобы генерировать UUID для уникальной строки, я использую следующий код: -генерации UUID из двойной таблицы

thread.createSession(); 
HexGenerator gen1 = new HexGenerator(); 
gen1.setHexId("2"); 
thread.ses.save(gen1); 
gen1 = (HexGenerator) thread.ses.load(HexGenerator.class, gen1.getHexId()); 
System.out.println("gen1-->" + gen1.getHexId()); 
thread.commit(); 

Ниже мой файл спящего режима: -

<class name="entity.HexGenerator" table="dual"> 
    <id name="hexId" type="string" unsaved-value="null"> 
     <generator class="uuid.hex"/> 
    </id> 
</class> 

UUID генерируется правильно, но я получаю сообщение об ошибке при совершении полной транзакции. как в следующей ошибке.

Exception in thread "main" - Could not synchronize database state with session 
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
    at com.ofss.test.hibernate.HibernateThread.commit(HibernateThread.java:29) 
    at com.ofss.test.hibernate.HibernateThread.main(HibernateThread.java:57) 
Caused by: java.sql.BatchUpdateException: ORA-00904: "HEXID": invalid identifier 

    at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10698) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) 
    ... 9 more 
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
    at com.ofss.test.hibernate.HibernateThread.commit(HibernateThread.java:29) 
    at com.ofss.test.hibernate.HibernateThread.main(HibernateThread.java:57) 
Caused by: java.sql.BatchUpdateException: ORA-00904: "HEXID": invalid identifier 

    at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10698) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) 

ответ

1

Вы не можете вставить или обновление виртуальной таблицы Oracle dual. Вы можете использовать его в select запросах. Итак, ваша строка thread.ses.save(gen1) является причиной ошибки. Я думаю, что если вы просто удалите эту строку, ошибка будет исправлена.

Но я не совсем понимаю, почему вам нужно получить доступ к базе данных, чтобы сгенерировать ваш UUID, который, кажется, сгенерирован в классе HexGenerator (или, возможно, в классе «uuid.gen», указанном в файле спящего режима).

+0

Я использую приведенный выше код для генерации UUID, но есть ли способ достичь того же ??? – 2010-11-24 13:52:47

+1

Да, есть несколько альтернатив. Вы можете проверить класс UDID JDK, http://download.oracle.com/javase/6/docs/api/java/util/UUID.html, который имеет некоторые статические методы для получения одного на основе разных алгоритмов. – 2010-11-24 14:12:17

-1

Во-первых, ваш код выглядит немного странно. Вы создаете экземпляр HexGenerator:

HexGenerator gen1 = new HexGenerator(); 

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

thread.ses.load(HexGenerator.class, gen1.getHexId()) 

После этого вы снова вызываете getHexId(). Я считаю, что код

new HexGenerator().getHexId() 

будет генерировать идентификатор, который вам нужен.

Но я думаю, что это еще не причина неудачи. К сожалению, вы не предоставили никакой информации о вашей схеме БД. Я считаю, что ваш идентификатор просто определяется как число, он не может принимать строки. Проверьте его еще раз и, пожалуйста, предоставьте более подробную информацию, если это не причина.

0

Чтобы преодолеть вышеуказанную проблему, я хочу сгенерировать UUID, теперь я решил использовать два метода: либо использовать java.util.UUID.randomUUID(), либо написать свою собственную логику для генерации того же массива бит, а затем рандомизации.

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