HQL не удаляет дочерние (один-ко-многим) записи, но ORM удаляет - PullRequest
0 голосов
/ 04 июня 2018

Учтите, что у меня есть отношение один ко многим между двумя объектами с параметром cascade = "save-update, delete" для коллекции.Удаление родительского объекта методом hibernate delete () удаляет дочерние элементы, но тот же запрос в hql этого не делает.Интересно, почему так?Вот мой пример кода.

HQL Delete (не удаляет дочерние элементы)

Session session = getSession(); 
String queryStr = "delete from SuperParent where name='" + objName + "'";
Query query = session.createQuery(queryStr);
int noOfRows deleted = query.executeUpdate();

Метод Delete (удаляет дочерние элементы)

Session session = getSession();
String queryStr = "from SuperParent where name='" + objName + "'";
Query query = session.createQuery(queryStr);
List<SuperParent> symbols = query.list();
for (SuperParent symbol : symbols)
{
    session.delete(symbol);
}

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

РЕДАКТИРОВАТЬ

Я читал этоpost Hibernate удаляет объекты на каскаде .

Массовое удаление не происходит каскадно

Но мне интересно, почему так, и предлагается следующее решение: «сначала удалить дочерние элементы, а затем удалить родительские»,Я не очень убежден в решении bcoz в рамках, в основном дети неизвестны, кто ссылается на родителя и хочет удалить его, когда родитель удаляется.Поэтому в таких случаях мы должны обязательно извлекать и удалять записи?

Ниже приведен пример случая, в котором я пытаюсь удалить SuperParent

<hibernate-mapping>
<subclass discriminator-value="ParentTable" extends="mypackage.SuperParent" name="mypackage.ParentTable">

  <set name="childTable" table="ChildTable" cascade="save-update,delete" lazy="false" fetch="select">
              <key>
                  <column name="ID" not-null="true" />
              </key>
              <one-to-many class="com.webnms.m2m.model.ChildTable" />
        </set>

<join fetch="select" table="ParentTable">
<key on-delete="cascade">
<column name="ID"/>
</key>
<property column="ParentTableNAME" length="100" name="ParentTableName" type="string"/>
</join>
</subclass>
</hibernate-mapping>

Пожалуйста, дайте мне знать, если вам требуется более подробная информация ото же самое, чтобы пролить свет на это.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...