【问题标题】:How to delete child table records during the update of parent table using Hibernate如何在使用 Hibernate 更新父表时删除子表记录
【发布时间】:2010-06-14 19:00:59
【问题描述】:

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

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

现在,如果我想在更新父表期间删除子表的行(这意味着现在,我只想用每个子表中的一行来更新表并删除其中的其他行)然后在休眠中如何处理这种情况?

更新

首先,很抱歉我的问题不清楚。以下是它的更多详细信息。

我有一个父表策略

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。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    在 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);
    

    或者,您可以将关系设置为使用 cascade="all-delete-orphan" ,这意味着一旦这些子实体失去对父实体的引用,hibernate 应该删除它们。这在您删除策略的情况下是相关的,那么策略关系也将从数据库中删除。

    【讨论】:

    • 如果我采用第二种方法,PolicyRelationship 中的外键不为空,因此会导致 DataIntegrityViolation 异常。不是吗?
    • 是的,你是对的。我越想,第二个例子就不清楚
    • 你能告诉我不清楚的地方吗?以便我知道我应该提供哪些更多信息。
    • 我尝试了第一种方法,但没有达到我的预期。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-27
      • 2020-11-26
      • 2013-01-19
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多