Как удалить записи дочерней таблицы при обновлении родительской таблицы с помощью Hibernate - PullRequest
0 голосов
/ 14 июня 2010

У меня есть родительская таблица A и дочерние таблицы B, C с отношениями "многие к одному".

Допустим, у меня есть данные, например, для первичного ключа 1 в родительской таблице A У меня есть 3 строки в дочерней таблице B и 4 строки в дочерней таблице C.

Теперь, если я хочу удалить строки дочерней таблицы во время обновления родительской таблицы (это означает, что теперь я хочу обновить таблицу только с одной строкой в ​​каждой дочерней таблице и удалить другие строки в них), тогда как справиться с этим сценарием в спящем режиме?

Обновление

Во-первых, извините, что мой вопрос был неясным. Вот более подробная информация об этом.

У меня есть родительская таблица Policy

CREATE TABLE "DEV2"."POLICY" ( "POLICY_OID" NUMBER(38,0) NOT NULL ENABLE, "CREATED_DATE" TIMESTAMP (0) NOT NULL ENABLE, "EFFECTIVE_DATE" TIMESTAMP (0), "UPDATED_DATE" TIMESTAMP (0), "STATUS" VARCHAR2(32 BYTE), CONSTRAINT "PK128" PRIMARY KEY ("POLICY_OID") , CONSTRAINT "REFPOLICY_CLASS290" FOREIGN KEY ("POLICY_CLASS") REFERENCES "DEV2"."POLICY_CLASS" ("POLICY_CLASS_REF") ENABLE )

и отношение @OneToMany к дочерней таблице POLICY_RELATIONSHIP

CREATE TABLE "DEV2"."POLICY_RELATIONSHIP" ( "POLICY_RELATIONSHIP_OID" NUMBER(38,0) NOT NULL ENABLE, "POLICY_ACTOR" NUMBER(38,0) NOT NULL ENABLE, "POLICY_ACTOR_TYPE" VARCHAR2(32 BYTE) NOT NULL ENABLE, "POLICY_OID" NUMBER(38,0) NOT NULL ENABLE, CONSTRAINT "PK156" PRIMARY KEY ("POLICY_RELATIONSHIP_OID") , CONSTRAINT "REFPOLICY338" FOREIGN KEY ("POLICY_OID") REFERENCES "DEV2"."POLICY" ("POLICY_OID") ENABLE)

Например, у меня есть пример данных примерно так.

POLICY_OID CREATED_DATE EFFECTIVE_DATE STATUS UPDATED_DATE
1234 06/14/2020 06/14/2010 active 06/14/2010

POLICY_RELATIONSHIP_OID POLICY_ACTOR POLICY_ACTOR_TYPE POLICY_OID
98765 John Primary User 1234

98766 Bill Secondary User 1234

98767 Mary Intermediate User 1234

Если я пытаюсь сохранить объект политики 1234 и UPDATED_DATE изменяется на 15.06.2010, а у PolicyRelationship есть данные, подобные приведенным ниже

POLICY_RELATIONSHIP_OID POLICY_ACTOR POLICY_ACTOR_TYPE POLICY_OID

null George Primary User 1234

Есть ли какой-либо возможный способ в спящем режиме удалить три строки, которые уже существуют в таблице PolicyRelation, и вставить новую строку с новыми данными.

Пожалуйста, дайте мне знать, если моя проблема все еще неясна.

Мое окружение:

Java 1.6, Hibernate 3.5, JBoss.

Ответы [ 2 ]

1 голос
/ 15 июня 2010

Сделайте это в java-коде, и если ваши отображения верны, все будет хорошо.Если вы используете какой-то каскад «save-update» или «all», ваш код будет выглядеть примерно так:

policy.getPolicyRelationships().clear();
PolicyRelationship pr = new PolicyRelationship();
...
pr.setParent(policy);
policy.getPolicyRelationships().add(pr);
dao.save(policy);

Или перезапишите существующий набор потомков нужными значениями.

policy.getPolicyRelationships().clear();
Set<PolicyRelationship> prSet = new TreeSet<PolicyRelationship>();
PolicyRelationship pr = new PolicyRelationship();
prSet.add(pr);
...
pr.setParent(policy);
policy.setPolicyRelationships(prSet);
dao.save(policy);

В качестве альтернативы вы можете установить отношение для использования cascade = "all-delete-orphan", что означает, что hibernate должен удалить этих потомков, как только они потеряют свою ссылку на родительский объект.Это актуально в случае, если вы удалите политику, тогда отношения политики также будут удалены из БД.

0 голосов
/ 14 июня 2010

С точки зрения _N_Hibernate, это может не применяться, но вы не можете установить параметры каскада (В NHibernate это будет cascade = "all, delete-orphan")?Затем просто убедитесь, что вы установили родителя каждого дочернего элемента в нуль, прежде чем сохранять родителя.

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