ORM отношения «многие к одному» и «многие ко многим» с использованием JDBC DAO - PullRequest
3 голосов
/ 29 мая 2011

Я пишу небольшой инструмент для учебных целей.
Основная задача - понять, как работать с постоянными данными без использования инструментов ORM.
Итак, есть небольшая БД с таблицами:

users(id, login, password, group_id)
groups(id, name, description)
roles(id, name, description)
// for many-to-many relationship between groups and roles.
groupsroles(group_id, role_id)

Итак, я реализовал шаблон DAO с 3 сущностями: пользователь, роль, группа.
Вопрос в том, каков наилучший способ реализовать работу со связями?
Как поделитьсятакое же соединение между UserDAO, GroupDAO, RoleDAO для использования транзакций БД?

Ответы [ 3 ]

2 голосов
/ 29 мая 2011

Один из вариантов - позволить службе запустить транзакцию JTA. Это будет автоматически доступно для всего кода, запущенного в одном потоке. Затем используйте пул управляемых соединений, чтобы соединения автоматически включались в выполняющуюся транзакцию JTA.

Вы можете выполнять обычную работу JDBC над соединениями, просто не вызывайте commit() для них, а вызывайте close() для них.

Если ваша цель - понять только постоянство, и вы не обязательно хотите думать о транзакциях в данный момент, вы можете использовать сессионные компоненты без состояния (EJB-компоненты). Они автоматически начнут и подтвердят транзакцию для вас. Служба может быть EJB, который будут вызывать ваши клиенты, и этот автоматически начнет транзакцию. Ваши DAO также могут быть сессионными компонентами без сохранения состояния и могут быть внедрены с источником данных.

, например

@Stateless
public class MyService {

   @EJB
   private UserDAO userDAO;

   @EJB
   private GroupDAO groupDAO;

   @EJB
   private RoleDAO roleDAO;

   public void myMethod() {    
        User user = userDAO.getById(...);
        Group group = groupDAO.getByUserId(...);
        // more DAO stuff
   }
}

@Stateless
public class UserDAO {

   @Resource(mappedName="java:/myDS")
   private DataSource dataSource;

   public void getById(Long id) {
      connection = dataSource.getConnection();
      // do JDBC work on connection
   }
}
1 голос
/ 29 мая 2011

Используйте локальную ветку для хранения ссылки на ваше соединение. DAO будет использовать соединение из сервисного уровня при прохождении соединения. Когда вызывающая сторона (сервисный уровень) не передает соединение, DAO будет использовать соединение из локального потока. Таким образом, все DAO могут совместно использовать одно и то же соединение в данном потоке.

Управление передачей осуществляется следующим образом.

Все транзакции инициируются и заканчиваются на уровне обслуживания. DAO не будет иметь никакой логики фиксации / отката. Поскольку соединение является общим для всех DAO, вызывающая сторона (уровень обслуживания) полностью контролирует транзакцию.

1 голос
/ 29 мая 2011

Легко позволить DAO совместно использовать соединение, потому что оно должно быть создано сервисным уровнем, передано в каждый объект DAO и закрыто.Просто передайте соединение.

Другая альтернатива - не делить соединение между тремя DAO.Вместо трех запросов вы можете сделать один запрос JOIN, вернуть все данные сразу и отобразить их в объекты.Наказание - больше байтов в сети, потому что вы возвращаете родительские данные для каждого дочернего объекта.

...