11

たとえば、EclipseLink 2.0.2で使用される次のエンティティ・クラスを検討してください。ここで、link属性は主キーではありませんが、それでも一意です。

@Entity
public class Profile {  
  @Id 
  private Long id;

  @Column(unique = true)
  private String link;

  // Some more attributes and getter and setter methods
}

属性の値が重複しているレコードを挿入するとlink、EclipseLink は をスローせずに をスローしEntityExistsExceptionDatabaseException一意の制約に違反したことを説明するメッセージが表示されます。

この例外をキャッチする単純でデータベースに依存しない方法がないため、これはあまり役に立ちません。これに対処するための推奨される方法は何でしょうか?

私が検討したいくつかのことは次のとおりです。

  • のエラー コードを確認していますDatabaseException- ただし、このエラー コードはデータベースのネイティブ エラー コードではないかと思います。
  • Profile事前に特定の値を持つa の存在を確認するlink- これは明らかに膨大な量の余分なクエリをもたらします。
4

2 に答える 2

5

リンク属性の値が重複しているレコードを挿入すると、EclipseLink で EntityExistsException がスローされない

はい、その場合、JPAプロバイダーはをスローすることは想定されていません。主キー以外のものをEntityExistException取得することはありません。EntityExistException

(...) ただし、一意の制約に違反したことを説明するメッセージとともに DatabaseException をスローします。

これは、EclipseLink からは非常に間違っています。JPAプロバイダーは、PersistenceExceptionまたはサブクラスをスローする必要がありますが、 o.e.p.e.DatabaseException. これはバグであり、以前の回答で既に述べたように報告する必要があります。

この例外をキャッチする単純でデータベースに依存しない方法がないため、これはあまり役に立ちません。これに対処するための推奨される方法は何でしょうか?

上記と同じ回答です。以前の回答を参照してください。

于 2010-05-23T20:53:03.870 に答える
2

JPA に ConstraintViolationException がないのは残念です。PersistenceException が特定のクラスの制約違反であるかどうかを判断するヘルパー メソッドを作成しました。ただし、これは休止状態のみです。他の実装を使用してそれを行う方法があると思います。

protected Boolean isUniqueConstraintViolation(PersistenceException ex, Class entity) {

    if (((NonUniqueObjectException)ex.getCause()).getEntityName().equals(entity.getName())) {
        return true;
    }

    return false;
}
于 2011-01-22T06:14:56.557 に答える