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

时间:2010-06-14 19:01:00

标签: hibernate

我有一个父表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关系到子表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更改为06/15/2010并且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。

2 个答案:

答案 0 :(得分:1)

在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应该删除这些孩子。这与删除策略相关,然后策略关系也将从数据库中删除。

答案 1 :(得分:0)

从_N_Hibernate方面来看,这可能不适用,但你不能设置级联选项(在NHibernate中它会是cascade =“all,delete-orphan”)?然后确保在保存父项之前将每个子项的父项设置为null。