古い 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番目のより良いアプローチはありますか?
どちらのアプローチも何らかの例外をキャッチすることに依存しているため (データベース内の何かを変更しようとする前にスローされる最初の例外を除く)、どのように決定すればよいかわかりません。