如何在使用Hibernate更新父表期间删除子表记录

如何在使用Hibernate更新父表期间删除子表记录,hibernate,Hibernate,我有一个具有多对一关系的父表a和子表B、C 假设我有这样的数据,对于父表A中的主键1,我在子表B中有3行,在子表C中有4行 现在,如果我想在更新父表的过程中删除子表的行(也就是说,现在我只想在每个子表中更新一行,并删除其中的其他行),那么如何在hibernate中处理这种情况 更新 首先,很抱歉我的问题不清楚。这里有更多的细节 我有一个父表策略 CREATE TABLE "DEV2"."POLICY" ( "POLICY_OID" NUMBER(38,0) NOT NULL ENABLE, "C

我有一个具有多对一关系的父表a和子表B、C

假设我有这样的数据,对于父表A中的主键1,我在子表B中有3行,在子表C中有4行

现在,如果我想在更新父表的过程中删除子表的行(也就是说,现在我只想在每个子表中更新一行,并删除其中的其他行),那么如何在hibernate中处理这种情况

更新

首先,很抱歉我的问题不清楚。这里有更多的细节

我有一个父表策略

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关系到子表策略\u关系

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,更新日期更改为2010年6月15日,并且PolicyRelationship具有如下数据

POLICY_RELATIONSHIP_OID POLICY_ACTOR POLICY_ACTOR_TYPE POLICY_OID

null George Primary User 1234
hibernate是否有任何可能的方法来删除PolicyRelation表中已经存在的三行,并用新数据插入新行

如果我的问题还不清楚,请告诉我

我的环境:


Java 1.6、Hibernate 3.5、JBoss。

从Hibernate的角度来看,这可能不适用,但您不能设置级联选项(在NHibernate中,它将是cascade=“all,delete orphan”)?在保存父项之前,请确保将每个子项的父项设置为null。

在java代码中执行此操作,如果映射正确,则一切都会正常。 如果您使用的是某种级联“保存更新”或“全部”,那么您的代码如下所示:

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);
policy.getPolicyRelationships().clear();
设置prSet=新树集();
PolicyRelationship pr=新的PolicyRelationship();
prSet.add(pr);
...
公共关系主任(政策);
政策。设定政策关系(prSet);
拯救(政策);

或者,您可以将该关系设置为使用cascade=“all delete orphan”,这意味着一旦这些子对象丢失对父实体的引用,hibernate应该删除这些子对象。如果您删除策略,那么策略关系也将从数据库中删除。

如果我执行第二种方法,则PolicyRelationship中的外键不为NULL,因此,这将导致DataIntegrityViolation异常。是吗?是的,你说得对。我想得越多,第二个例子就越不清楚,你告诉我什么不清楚。这样我就知道我应该提供更多的信息。我尝试了第一种方法,但没有达到我的预期效果。