0

古い Book and Authors モデルがあり、両方に CRUD があるとします。ユーザーが著者を削除しようとするとき、著者がすでに本を登録している場合は、最初に著者の本を削除する必要があることを伝えたいと思います。

つまり、参照がない場合にのみレコードを削除したいのですが、参照がある場合は、ユーザーに警告したいだけです。

最初のアプローチ:

私が今まで行ってきた方法は次のようになります。

@PersistenceContext
private EntityManager em;

public void deleteAuthor(Author author){
    Long qtBooks = em.createQuery(
           "SELECT COUNT(b) FROM Book b WHERE b.author.id = :id")
           .setParameter("id", author.getId()).getSingleResult();
    if (qtBooks > 0) {
        throw IllegalArgumentException("This author has books registered");
    }
    em.remove(em.getReference(Author.class, author.getId()));
}

... そして、プレゼンテーション層 (JSF Bean) で例外 (IllegalArgumentExceptionこの場合は ) をキャッチし、そのエラー メッセージをユーザーに表示します。

2番目のアプローチ:

私はSpringを使用しているのでDataIntegrityViolationException、プレゼンテーション層でSpringの , をキャッチする別の方法があることを知っています。次に、ビジネス メソッドには、エンティティを削除するためのコードが含まれます。

public void deleteAuthor(Author author){
    em.remove(em.getReference(Author.class, author.getId()));
}

...そして、プレゼンテーションレイヤー(私の場合はJSF Bean)はSpring Exceptionをキャッチできます:

@ManagedProperty("#{authorService}");
private AuthorService authorService;

public void deleteAuthor(Author author) {
    try {
        authorService.deleteAuthor(author);
        addGlobalInfo("Author deleted");
    } catch (DataIntegrityViolationException e) {
        addGlobalError("This author already has books associated");
    }
    redirect(getRequestURL());
}

さて、私はしばらくの間、最初のアプローチを行ってきましたが、この 2 番目のアプローチの方がはるかに書きやすいと感じています。私の質問は、この特定の例外を使用してアプリケーションをより Spring に関連付けることに加えて、2 番目のアプローチを行うことの欠点は何ですか? 最初のものの本当の長所は何ですか? とにかく、それは良いですか?JPAでこれを行うための3番目のより良いアプローチはありますか?

どちらのアプローチも何らかの例外をキャッチすることに依存しているため (データベース内の何かを変更しようとする前にスローされる最初の例外を除く)、どのように決定すればよいかわかりません。

4

1 に答える 1

1

どちらのアプローチも問題ありませんが、2 番目のアプローチは柔軟性に欠けます。

  • 複数のエンティティが関与するより大きなトランザクション内にこのメソッドがある場合、例外が作成者の削除によって引き起こされたものであり、無関係なものによって引き起こされたものではないことを確認できません。
  • 著者が書籍以外のエンティティによって参照されている場合、書籍を削除する必要があることをユーザーに伝えることはできません。作成者を参照する他のエンティティである可能性があります

最初のアプローチでは、例外をスローする目的がプレゼンテーション層で例外をキャッチできるようにすることである場合 (単に一般的なエラー メッセージを表示するのではなく)、より具体的な例外を使用することに注意してくださいBookStillReferencesAuthorException。例外はより明確になり、まだ著者を参照している本とは関係のない IllegalArgumentException をキャッチするリスクがなくなります。

于 2012-08-10T20:20:01.400 に答える