Как удалить ненужную сущность из сеанса Hibernate? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь получить Entity1, запрашивая сопоставленные сущности к нему. Я использую CriteriaBuilder, чтобы выполнить это, как показано ниже

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity1> createQuery = criteriaBuilder.createQuery(Entity1.class);
Root<Entity1> root = createQuery.from(Entity1.class);
Join<Entity1, MappedEntity2> mappedEntity2Join = root.join("mappedEntity2");
createQuery.select(root);

predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get(COL_USER_ID), userId));

// where clause to filter by query params
createQuery.where(predicate).distinct(true);
createQuery.getRestriction();

TypedQuery<Entity1> query = entityManager.createQuery(createQuery);

Но в случайных случаях я обнаружил, что запрос был выполнен на «Entity2.entities1» без указания Entity2 в соединении. Я предполагаю, что Entity2 уже доступен в сессии, и он был лениво инициализирован с entity1. Из-за этого Критерии генерирует запрос для Entity2 вместо Entity1.

Есть ли способ ограничить критерии запроса на Entity1? или как удалить Entity2 из сеанса до выполнения этого конкретного критерия.

Ожидаемый запрос,

select * 
from Entity1 obj1_ 
inner join mappedEntity1 mObj_ on obj1_.obj_id=mObj_.id 
where obj1_.id=?

Но запрос был сгенерирован как

select * 
from entities1_entities2 obj0_ 
inner join Entity1 obj1_ on obj0_.obj_id=obj1_.id 
where obj0_.entity2_id=?

Структура сущностей:

public class Entity1 {

    @ManyToOne
    MappedEntity1 mappedEntity1;

    @OneToMany
    MappedEntity2 mappedEntity2;

    @OneToMany
    MappedEntity3 mappedEntity3;

}

и

public class Entity2 {

    @OneToMany
    List<Entity1> entities1;

    @OneToOne
    MappedEntity2 mappedEntity2;

}

Справочная таблица для Entity1 и Entity2

Имя таблицы: entity1_entities2

entity1_id INTEGER NOT NULL,
entity2_id INTEGER NOT NULL,
CONSTRAINT entities1_entities2_entity1_id_fkey FOREIGN KEY (entity1_id)
REFERENCES entity1 (id),
CONSTRAINT entities1_entities2_entity2_id_fkey FOREIGN KEY (entity2_id)
    REFERENCES entity2 (id)

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Я не уверен на 100% в этом. Попробуйте закрыть текущий сеанс и открыть другой, прежде чем выполнять поиск.

session.close();
session = sessionFactory.openSession();

Это должно очистить ранее созданные (лениво инициализированные) сущности.

0 голосов
/ 06 ноября 2018

Большинство IDE могут обрабатывать объекты для вас. Возможно, вам удастся найти инструмент, который отображает все объекты и позволяет изменять их в выбранной вами среде IDE.

0 голосов
/ 02 ноября 2018

Во-первых, вам нужно проверить, существует ли старая сущность или нет, прежде чем отправлять запрос новой сущности. Вы можете напрямую попытаться передать свою сущность в session.delete (), чтобы удалить этот объект. Должно быть исключение, если в базе данных не найдено записей, которые необходимо обработать. На самом деле, мы обычно не понимаем этого случая. Мы всегда удаляем существующую сущность, я имею в виду обычную логику; так что нет необходимости делать это, если уже сделано. Вы можете просто сделать это,

Entity1 ent = session.load(Entity1.class, '1234');
session.delete(ent);

или вы можете сделать это вместо этого,

Entity1 ent = new Entity1('1234'); // used constructor for brevity
session.delete(ent);

Кстати, вы также можете использовать эту версию session.delete (String query),

session.delete("from Entity1 e where e.id = '1234'"); // Just found it is deprecated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...