2

Oracle XE データベースを使用するプロジェクトで、GeneratedValue アノテーションの問題に直面しています。値が生成されないだけです。自動生成されたフィールドを使用してテーブルに行を挿入しようとすると、エラーが発生し続けます。

"Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SYSTEM"."T_VAPP"."VAPPID")"

まったく同じコードが Derby または MySQL で動作しますが、Oracle で動作させる必要があり、生成されたフィールド定義に入力したものはすべて無視されるようです。GenerationType.TABLE、GenerationType.SEQUENCE を使用してみましたが、同じエラーが続きます。また、Oracle SQL 開発者を使用して、コードで定義されたシーケンスが作成されていないことを確認しました。ここで何が恋しいですか?

@Entity
@Table(name = "T_vApp")
@RooJavaBean
@RooToString
@RooJpaActiveRecord(identifierColumn = "vAppId", identifierField = "id",  table = "T_vApp")
public class VLabApplication {



  @Id
  @GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
  @SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
  @Column(name = "vAppId" )
  private Long id;
4

3 に答える 3

2

識別子フィールドが何であるかを2か所で伝えているため、混乱している可能性があると思います。さらに、@Table と @RooJpaActiveRecord アノテーション内の引数の両方でそれを伝えています。おそらく、クラスの @RooJpaActiveRecord アノテーションからすべての引数を削除する必要があります。クラス「id」メンバーの @Id および @Column アノテーションと、クラスの @Table アノテーションを残します。

または、どのデータベースに基づいて正しいことを行うカスタム ジェネレーター クラスに切り替える必要がある場合もあります。

于 2012-11-19T02:22:46.507 に答える
2

GenerationType.AUTO正しいです --- これにより、コードが mysql だけでなく oracle でも機能することが保証されます (コードを変更する必要はありません)。私はこのように使用していますが、問題はありませんでした。

魔法を取り除き、@Rooセッター/ゲッターを生成して、これが役立つかどうかを確認してください。ところで、私は通常、ゲッターに注釈を付けます。これは問題ではないと思いますが、他のすべてが失敗した場合はいつでも試すことができます。

私の推測では、roo と hibernate の間に何らかの問題があると考えられます (roo を使用したことも読んだこともないので、推測です)。

于 2012-11-18T15:51:32.100 に答える
1

GenerationType.AUTO代わりに使用しましたGenerationType.SEQUENCE

于 2012-11-17T16:43:25.520 に答える