Что ж, у меня есть двусторонние отношения «многие ко многим» между двумя объектами «задача» и «работник». Я настроил каскадное поведение во всех операциях по обе стороны отношений. Что действительно происходит, так это то, что как только я назначаю сотрудника в задании, я могу видеть сотрудников, которые выполняют это задание, но когда я перечисляю сотрудников, никакое задание не объединяется. Видимо, таблица этих отношений в базе данных верна. Но самое странное, что происходит, заключается в том, что, чтобы попытаться обойти это, при операции вставки сотрудника в задачу, я взял список задач сотрудника и добавил задачу, а затем я также фиксирую сущность сотрудника, делая это, когда Я 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);
}
}
Я не знаю Очень хорошо, как работают критерии, но это единственный способ, который сработал для меня.