想象一下你有
<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尝试按以下顺序执行操作:
并在第二步中失败,因为它违反了&#39; not null&#39;约束&#39; value_a&#39;。
问题(S): 怎么克服这个?为什么hibernate以如此奇怪的顺序执行东西?为什么它会尝试将字段排除在外呢?