генерация UUID из двойной таблицы - PullRequest
1 голос
/ 24 ноября 2010

Я хочу сгенерировать 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)

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

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

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

0 голосов
/ 04 декабря 2010

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

0 голосов
/ 24 ноября 2010

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

HexGenerator gen1 = new HexGenerator();

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

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

Затем вы снова вызываете getHexId ().Я считаю, что код

new HexGenerator().getHexId() 

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

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

...