Я использую шаблон DAO, чтобы обеспечить доступ к моему уровню сохранения в приложении, которое я создавал.Рекомендации по внедрению DAO
Одна из вещей, которые я реализовал, является «оберткой» вокруг моих реализаций DAO для целей проверки. Обертка принимает экземпляр моего DAO в качестве параметра конструктора и реализует аналогичный интерфейс, такой как DAO, за исключением типов исключенных типов.
Например:
бизнес-логики Интерфейс
public interface UserBLInt {
private void assignRightToUser(int userId, int rightId) throws SomeAppException;
}
DAO интерфейс
public interface UserDAOInt {
private void assignRightToUser(int userId, int rightId) throws SomeJPAExcption;
}
Бизнес Логика Реализация
public class UserBLImpl implements UserBLInt {
private UserDAOInt userDAO;
public UserBLImpl(UserDAOInt userDAO){
this.userDAO = userDAO;
}
@Override
private void assignRightToUser(int userId, int rightId) throws SomeAppException{
if(!userExists(userId){
//throw an exception
}
try{
userDAO.assignRightToUser(userId, rightId);
} catch(SomeJpAException e){
throw new SomeAppException(some message);
}
}
}
DAO Реализация
public class UserDAOImpl implements UserDAOInt {
//......
@Override
public void assignRightToUser(int userId, int rightId){
em.getTransaction().begin();
User userToAssignRightTo = em.find(User.class, userId);
userToAssignRightTo.getRights().add(em.find(Right.class, rightId));
em.getTransaction().commit();
}
}
Это лишь небольшой пример, но мой вопрос, кажется, «лишними» в рамках реализации DAO, чтобы сделать другую проверку, чтобы убедиться, что User
не равно нулю, перед добавлением Right
, но, как программист, я вижу возможность для нулевого указателя.
Очевидно, я мог бы добавить нулевую проверку после вызова find в диспетчере сущностей и выбросить исключение, если возвращается null, но это целая цель иметь DAO, завернутую в реализацию бизнес-логики, выполнить всю работу по проверке заранее , так что код DAO является чистым и не должен делать много на пути нулевых проверок или много логики вообще. Поскольку у меня есть обертка вокруг DAO, все-таки хорошая идея делать нулевую проверку в DAO? Я знаю, что теоретически объект может быть удален между вызовом бизнес-логики и вызовом dao, это маловероятно, и проверка на нуль кажется дублированной работой. Какова наилучшая практика для такой ситуации?
EDIT:
ли это выглядеть подходящей модификации DAO?
public EntityManager beginTransaction(){
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
return entityManager;
}
public void rollback(EntityManager entityManager){
entityManager.getTransaction().rollback();
entityManager.close();
}
public void commit(EntityManager entityManager){
entityManager.getTransaction().commit();
entityManager.close();
}
спасибо за ваш ответ, я ценю это – user1154644
я видел EJB использовали и методы их помечено как требующее новую транзакцию. Если это стандартное java-приложение, а не приложение j2ee, было бы нормально вручную обрабатывать откаты? – user1154644
Я бы использовал Spring в этом случае. –