java - 从双表生成 UUID

标签 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)

最佳答案

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

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

关于java - 从双表生成 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4267308/

相关文章:

bash - 如何在shell脚本中生成uuid

java - 如何在 Hibernate 中内连接两个独立实体

java - Hibernate JCache 5.4.3.Final 不适用于 JCache 5.4.2.Final 配置

java.lang.IllegalStateException : Timer already cancelled when webapp redeploys on tomcat 错误

java - Maven 强制插件缺少或无效规则

iphone - 将移动应用程序用户与其在线个人资料联系起来的最佳方式是什么?

django - 为什么我的 Django 应用程序在 Azure 上失败且 UUID 语法无效

java - 在 Guice 中获取 MapBinder 的实现

java - 比较 Java 中的字符串(较大者或较小者)

java - 在 intellij : how can i see the all thrown exceptions? 中调试多线程