EJB memiliki konsep pengecualian sistem dan pengecualian aplikasi.
Pengecualian waktu proses, seperti EntityExistsException
adalah pengecualian sistem. Ini antara lain akan menyebabkan transaksi dibatalkan dan menyebabkan kacang instance EJB dibuang (dihancurkan). Yang paling penting untuk masalah Anda, mereka akan dibungkus dengan EJBException
.
Tidak ada keajaiban untuk menangkap pengecualian ini. Menyesuaikan kode dari Petr di atas,
berikut ini hanya akan berfungsi:
Kacang punggung:
@EJB
private DAOBean daoBean;
public void savePerson(Entity e) {
try {
daoBean.save(e);
} catch (EJBException e) {
FacesMessage message = new FacesMessage("entity is already exists.");
FacesContext.getCurrentInstance.addMessage(null, message);
}
}
EJB:
private EntityManager em;
public void save(Entity e) {
em.persist(e);
}
Perhatikan bahwa Anda dapat mengambil penyebab pengecualian untuk melihat apakah itu EntityExistsException
atau tidak (dihilangkan di atas untuk singkatnya).
Karena Anda mungkin tidak perlu memusnahkan instance EJB Anda untuk kasus ini, pola yang lebih baik adalah mendefinisikan pengecualian Anda sendiri yang mewarisi dari RuntimeException
dan dijelaskan dengan @ApplicationException
dengan rollback
atribut disetel ke true.
Mis.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Bungkus EntityExistsException
Anda di EJB Anda ke dalam pengecualian ini dan lempar dan tangkap.
Saya sangat menyarankan Anda TIDAK untuk menggunakan kode kesalahan atau keberhasilan/kegagalan boolean sebagai hasilnya. Ini adalah pola anti yang terkenal dan membuat kode Anda rentan terhadap kesalahan.