2010-11-24 22 views
1

は、私は次のコードを使用しています: - :生成UUID

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

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(); 

は私の休止状態ファイルです正常に完了しましたが、完全なトランザクションがコミットされるとエラーが発生します。次のようなエラーが表示されます。

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)という行がエラーを生成します。私はあなたがこの行を削除するだけで、エラーが修正されると思います。

しかし、HexGeneratorクラス(またはおそらくhibernateファイルで参照される "uuid.gen"クラス)で生成されるように見えるUUIDを生成するために、データベースにアクセスする必要があるのか​​どうか分かりません。

+0

私はUUIDを生成するために上記のコードを使用していますが、同じことを達成するための方法はありますか? –

+1

はい、いくつかの選択肢があります。異なるアルゴリズムに基づいて静的メソッドを取得するUUID JDKクラス(http://download.oracle.com/javase/6/docs/api/java/util/UUID.html)を確認できます –

+0

または、あなたのUUIDが従うフォーマットを選択すると、自分で作成することができます。 –

-1

まず、あなたのコードは少し奇妙に見えます。あなたはHexGeneratorのインスタンスを作成します。

HexGenerator gen1 = new HexGenerator(); 

はそれを使用して、すぐに私のための動的クラスローディングを使用するAPIをいくつかの未知を使用して上書きします。

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

次に、getHexId()を再度呼び出します。私はそのコードを信じる

new HexGenerator().getHexId() 

あなたが必要とするIDを生成します。

しかし、私はそれがまだ失敗の理由ではないと思います。残念ながら、DBスキーマに関する情報は提供していません。私はIDが単に数字として定義されていると信じています、それは文字列を受け入れることができません。これが理由でない場合は、もう一度確認し、詳細を記入してください。

+0

答えを編集してコードフォーマットを追加しました。 –

0

上記の問題を解決するには、UUIDを生成することを意味します。java.util.UUID.randomUUID()を使用するか、ビット配列を使用して同じものを生成してランダム化するという2つの方法を使用することにしました。

関連する問題