Непонятное поведение в отношениях Hibernate «многие ко многим» - PullRequest
0 голосов
/ 23 февраля 2020

Что ж, у меня есть двусторонние отношения «многие ко многим» между двумя объектами «задача» и «работник». Я настроил каскадное поведение во всех операциях по обе стороны отношений. Что действительно происходит, так это то, что как только я назначаю сотрудника в задании, я могу видеть сотрудников, которые выполняют это задание, но когда я перечисляю сотрудников, никакое задание не объединяется. Видимо, таблица этих отношений в базе данных верна. Но самое странное, что происходит, заключается в том, что, чтобы попытаться обойти это, при операции вставки сотрудника в задачу, я взял список задач сотрудника и добавил задачу, а затем я также фиксирую сущность сотрудника, делая это, когда Я go вижу сотрудников, задачи - это списки (но только те, которые я добавил после изменения метода), и, что еще хуже, они перечислены дважды. Я немного сбит с толку, если только вставка одной стороны уже решает, почему я могу только визуализировать, когда вставляю две стороны, и все же я визуализирую неожиданным образом?

Метод save в классе BaseDAO:

public void save(E e, Session session) throws DAOException {
    try{
        session.beginTransaction();
        session.saveOrUpdate(e);
        session.getTransaction().commit();
    } catch (Exception ex) {
        throw new DAOException(ex);
    }
}

(я получаю сеанс в качестве параметра в случае, если мне нужно выполнить больше операций и проверок в БД, используя тот же метод на уровне обслуживания, не теряя ссылку на сеанс, если это слишком абсурдно, пожалуйста, укажите более подходящий способ)

Первая попытка метода в слое обслуживания

public void save(Task task) throws ServiceException {
    try (Session session = taskDAO.openSession()) {
        try {
            taskDAO.save(task, session);

        } catch (Exception ex) {
            session.getTransaction().rollback();
            throw new ServiceException(ex);
        }
    }
}

и сопоставление свойств в Задании:

@ManyToMany(cascade = CascadeType.ALL)
private List<Employee> designations;

Сотрудник:

@ManyToMany(cascade = CascadeType.ALL)
private List<Task> tasks;

Если вам нужно проанализировать что-то еще, дайте мне знать

И извините за английский sh, это не мой родной язык

* Я использую базу данных H2 для настольного приложения

Редактировать (таблицы): К моему удивлению, таблица соединения не имеет повторяющихся значений

TASK_ID     EMPLOYEE_ID  
9   7
9   8
9   4
9   6
9   5
10  4
11  6
11  7
12  4
12  5
13  8
13  5

Мой метод поиска всех:

public List<E> findAll(Session session) throws DAOException{
        try {
            CriteriaBuilder builder = session.getCriteriaBuilder();
            CriteriaQuery<E> criteriaQuery = builder.createQuery(clazz);

            criteriaQuery.from(clazz);

            List<E> resultList = session.createQuery(criteriaQuery).getResultList();

            return resultList;

        } catch (Exception ex) {
            throw new DAOExceptioon(ex);
        }
    }

Я не знаю Очень хорошо, как работают критерии, но это единственный способ, который сработал для меня.

...