代码之家  ›  专栏  ›  技术社区  ›  M.J.

从双表生成UUID

  •  1
  • M.J.  · 技术社区  · 14 年前

    我要为唯一字符串生成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 回复  |  直到 14 年前
        1
  •  1
  •   Tomas Narros    14 年前

    不能在Oracle上插入或更新 dual 虚拟表。你只需要在 select 查询。 所以,你的台词 thread.ses.save(gen1) 是产生错误的原因。我想如果你只删除这一行,错误就会被修正。

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

        2
  •  0
  •   Tomas Narros    14 年前

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

        3
  •  -1
  •   Tomas Narros    14 年前

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

    HexGenerator gen1 = new HexGenerator();
    

    使用它并立即使用一些使用动态类加载的未知for me API进行重写。

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

    然后再次调用gethexid()。我相信那个密码

    new HexGenerator().getHexId() 
    

    将生成您需要的ID。

    但我认为这还不是失败的原因。不幸的是,您没有提供任何有关DB模式的信息。我相信您的ID只是简单地定义为数字,它不能接受字符串。再次检查,如果不是原因,请提供更多详细信息。