У меня есть 3 сущности, взаимодействующие друг с другом, как объяснено ниже.
Entity_A {
@Id
private String id;
@OneToMany(cascade=CascadeType.ALL, mappedBy="a", orphanRemoval=true)
private List<Entity_B> b;
@OneToMany(cascadeType.ALL, mappedBy="a", orphanRemoval=true)
private List<EntityRelationship_A_B> relationship;
}
@Embeddable
EntityRelationship_A_B_Id {
@Column(name="a_id")
private String a_id;
@Column(name="b_id")
private String b_id;
@Column(name="relationship_id")
private String relationship_id;
}
EntityRelationship_A_B {
@EmbeddedId
private EntityRelationship_A_B_Id id;
@ManyToOne
@JoinColumn(name="a_id", referencedColumn="a_id", insertable=false, updateable=false)
private Entity_A a;
@OneToOne(cascade = CascadeType.ALL, mappedBy="relationship", orphanremoval = true)
private Entity_B b;
}
@Embeddable
Entity_B_Id {
@Column(name="a_id")
private String a_id;
@Column(name="b_id")
private String b_id;
//std methods
}
Entity_B {
@EmbeddedId
private Entity_B_Id id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id", referencedColumn = "a_id", insertable = false, updateable = false)
private Entity_A a;
@OneToOne(fetch = fetchType.LAZY)
@JoinColumn(name = "a_id", referencedColumn="a_id", insertable=false, updateable=false)
@JoinColumn(name="b_id", referencedColumn="b_id", insertable=false, updateable=false)
@JoinColumn(name="relationship_id", referencedColumn="relationship_id", insetable=false, updateable=false)
private EntityRelationship_A_B relationship;
// ....
}
ServiceImpl {
save (...) {
Manually populate and set Entity_B_Id into individual instance_A.instance_B
Manually populate and set EntityRelationship_A_B_Id into individual instance_A.instance_A_B
//...finally save the top level entity...
}
}
Из-за характера данных тот же экземпляр из Entity_B
не может относится к обоим Entity_A
и EntityRelationship_A_B
.
При использовании двунаправленных ссылок для сторон, я вижу, что EntityRelationship_A_B
сохраняет с правильными значениями для a_id, b_id, relationship_id
;
Но Entity_B
всегда сохраняется с null
для relationship_id
;фактически оператор вставки для Entity_B
никогда не содержит relationship_id
столбца вообще.Однако я могу гарантировать, просматривая значения времени выполнения, что ссылки EntityRelationship_A_B
установлены правильно EntityRelationship_A_B.Entity_B
.
Что я делаю неправильно?