2010-11-11 118 views
0

我是新的休眠。所以,我不知道如何做到这一点:休眠:从关联表中删除记录与外键

我有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注释或其他方式来摆脱这个错误?

+0

请尝试@Cascade({CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN}),并显示如何从列表中删除AsdPersonEvent。 – blow 2010-11-11 10:49:05

+0

我已经展示了如何从列表中删除AsdPersonEvent。 – brazh 2010-11-11 11:00:43

+0

@blow:不,它不起作用。我不明白,当你说:“显示如何从列表中删除AsdPersonEvent”时,你的意思是什么。 – brazh 2010-11-11 12:25:03

回答

0

通过去除orphanRemoval = true

+0

我试过了,但它没有帮助我。没有错误,但记录未被删除。 – brazh 2010-11-11 10:27:57

2

如果你有持久实体的复杂的图形再试一次,我想你需要放弃使用orphanRemoval和使用em.remove()手动删除您的实体。

orphanRemoval是专为简单的父母与子女的关系,其中孩子没有父母没有意义。如果在你的情况下,孩子可能有其他的关系,也许这不是orphanRemoval的好例子。

+0

当我保存对象ev时,它具有结构ev-> AsdPersonEvent(not null) - > AsdPerson(not null) - > AsdPersonEvent(null)。我可以在保存ev之前手动删除AsdPersonEvent中的记录,但我认为有更合适的Hibernate注释解决方案。 – brazh 2010-11-11 13:25:13

+0

@brazh:已更新。 – axtavt 2010-11-11 13:34:15

+0

感谢您的回答。到目前为止,我手动从AsdPersonEvent中删除记录,但如果有更好的解决方案,我会很乐意使用它:) – brazh 2010-11-11 14:26:25