从双表生成UUID

时间:2010-11-24 13:30:52

标签: java hibernate 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();

下面是我的hibernate文件: -

<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 个答案:

答案 0 :(得分:1)

您无法在Oracle dual虚拟表上插入或更新。您可以在select次查询时使用它。 因此,您的行thread.ses.save(gen1)就是产生错误的原因。我想如果你只是删除这一行,错误将被修复。

但是我真的不明白为什么你需要访问数据库来生成你的UUID,它似乎是在HexGenerator类中生成的(或者可能是在hibernate文件中引用的“uuid.gen”类)。 / p>

答案 1 :(得分:0)

为了克服上述问题,我的意思是生成UUID,现在我决定使用两种方法,要么使用java.util.UUID.randomUUID()要么编写我自己的逻辑来生成相同的使用位数组然后随机化它

答案 2 :(得分:-1)

首先,你的代码看起来有点奇怪。您创建HexGenerator的实例:

HexGenerator gen1 = new HexGenerator();

使用它并立即覆盖使用一些未知的API,它使用动态类加载。

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

然后再次调用getHexId()。我相信代码

new HexGenerator().getHexId() 

将生成您需要的ID。

但我认为这还不是失败的原因。很遗憾,您没有提供有关数据库架构的任何信息。我相信你的ID只是被定义为数字,它不能接受字符串。如果不是这个原因,请再次检查并提供更多详细信息。

相关问题