休眠:从关联表中删除记录与外键
我是新的休眠。所以,我不知道如何做到这一点:休眠:从关联表中删除记录与外键
我有3个表:
表人:
@Entity
@Table(name = "ASD_PERSON")
public class AsdPerson implements Serializable {
@Id
@SequenceGenerator(name="seq_name", sequenceName="gen_id_value", allocationSize = 1)
@GeneratedValue(generator="seq_name")
@Column(name="F_PERSON_ID", nullable = false)
private Long fPersonId;
@OneToMany(mappedBy = "AsdPerson",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<AsdPersonEvent> asdPersonEventList;
... setters and getters ...
}
表事件:
@Entity
@Table(name = "ASD_EVENT")
public class AsdEvent implements Serializable {
@Id
@SequenceGenerator(name="seq_name", sequenceName="gen_id_value", allocationSize = 1)
@GeneratedValue(generator="seq_name")
@Column(name="F_EVENT_ID", nullable = false)
private Long fEventId;
@OneToMany(mappedBy = "AsdEvent",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<AsdPersonEvent> asdPersonEventList;
... setters and getters ...
}
表与人事件:
@Entity
@Table(name = "ASD_PERSON_EVENT")
@IdClass(AsdPersonEventPK.class)
public class AsdPersonEvent implements Serializable {
@Id
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "asdPerson"))
@GeneratedValue(generator = "generator")
@Column(name="F_PERSON_ID", nullable = false, insertable = false,
updatable = false)
private Long fPersonId;
@Id
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "asdEvent"))
@GeneratedValue(generator = "generator")
@Column(name="F_EVENT_ID", nullable = false, insertable = false,
updatable = false)
private Long fEventId;
@ManyToOne
@JoinColumn(name = "F_PERSON_ID", insertable = false,
updatable = false)
private AsdPerson asdPerson;
@ManyToOne
@JoinColumn(name = "F_EVENT_ID", insertable = false,
updatable = false)
private AsdEvent asdEvent;
... setters and getters ...
}
Everything works完美(添加新记录,创建新的对象)的情况下除外,当我尝试删除事件表或Person表相关的记录:
...
AsdEvent ev = getService().get(115); // get record from Event table by id = 115 (for example)
ev.getAsdPersonEventList().remove(1); // delete some existing records
getService().merge(ev);
...
之后,我得到的错误:
deleted object would be re-saved by cascade (remove deleted object from associations): [database.AsdPersonEvent#[email protected]]
如何配置Hibernate注释或其他方式来摆脱这个错误?
如果你有持久实体的复杂的图形再试一次,我想你需要放弃使用orphanRemoval
和使用em.remove()
手动删除您的实体。
orphanRemoval
是专为简单的父母与子女的关系,其中孩子没有父母没有意义。如果在你的情况下,孩子可能有其他的关系,也许这不是orphanRemoval
的好例子。
当我保存对象ev时,它具有结构ev-> AsdPersonEvent(not null) - > AsdPerson(not null) - > AsdPersonEvent(null)。我可以在保存ev之前手动删除AsdPersonEvent中的记录,但我认为有更合适的Hibernate注释解决方案。 – brazh 2010-11-11 13:25:13
@brazh:已更新。 – axtavt 2010-11-11 13:34:15
感谢您的回答。到目前为止,我手动从AsdPersonEvent中删除记录,但如果有更好的解决方案,我会很乐意使用它:) – brazh 2010-11-11 14:26:25
请尝试@Cascade({CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN}),并显示如何从列表中删除AsdPersonEvent。 – blow 2010-11-11 10:49:05
我已经展示了如何从列表中删除AsdPersonEvent。 – brazh 2010-11-11 11:00:43
@blow:不,它不起作用。我不明白,当你说:“显示如何从列表中删除AsdPersonEvent”时,你的意思是什么。 – brazh 2010-11-11 12:25:03