Hibernate在“更新”期间将map-key设置为null。

时间:2016-08-07 18:49:07

标签: sql hibernate orm

想象一下你有

<system.web>
    <securityPolicy>
        <trustLevel name="Full" policyFile="internal"/>
    </securityPolicy>
</system.web>

AValueObject应该是一个VO,但由于关系数据库的性质,它有一个虚拟ID:

@EqualsAndHashcode(of = "id")
class AnAggregate {

    private int id;
    private Map<String, AValueObject> childrenByValueA;

    void replaceChild(AValueObject childToReplace) {
        childrenByValueA.put(childToReplace.getValueA(), childToReplace);
    }

}

现在,看一下AnAggregate类的xml映射部分:

@EqualsAndHashcode(exclude = "aDummyID")
class AValueObject {
    private int aDummyID;
    private String valueA;
    private String valueB;

}

现在,当我按如下方式创建表时:

<map name="childrenByValueA" fetch="select" batch-size="666">
            <key column="aggregate_id"/>
            <map-key type="string" column="value_a"/>
            <one-to-many class="AValueObject"/>
</map>
一切似乎都有效。

但如果我宣布:

create table an_aggregate (
    aggregate_id bigint,
    primary key (metric_id)
);

crate table a_value_object (
    vo_id bigint,
    aggregate_id bigint,
    value_a varchar(255),
    value_b varchar(255),
    primary_key (vo_id);
);

alter table a_value_object add constraint a_fk foreign key (aggregate_id) references an_aggregate;

然后我在更新操作期间违反完整性。

假设我们有 anAggregate - (1) aValueObject(1,1,value_a,value_b) 我们想用(_,1,modified_value_a,modified_value_b)

替换该行

事实证明,hibernate尝试按以下顺序执行操作:

  • 插入a_value_object值(2,1,modified_value_a, modified_value_b)
  • 更新a_value_object set aggregate_id = null,value_a = null,其中aggregate_id = 1且vo_id = 1
  • 从a_value_object中删除,其中vo_id = 1

并在第二步中失败,因为它违反了&#39; not null&#39;约束&#39; value_a&#39;。

问题(S): 怎么克服这个?为什么hibernate以如此奇怪的顺序执行东西?为什么它会尝试将字段排除在外呢?

0 个答案:

没有答案