Hibernate删除问题与双向关联

时间:2015-03-27 13:14:02

标签: mysql spring hibernate jpa spring-data-jpa

我将Spring Data JPA(1.7.2-RELEASE)与Hibernate(4.3.8.Final)和MySQL(5.5)结合使用。我想在双向协作中管理两个实体。内容的保存和更新工作正常,但删除不起作用。

@Entity
public class Beacon extends AbstractEntity {

@OneToMany(fetch = FetchType.EAGER, mappedBy = "beacon", cascade = ALL)
private Set<Comment> comments;

/**
 * @return the comments
 */
public Set<Comment> getComments() {
    return comments;
}

/**
 * @param comments the comments to set
 */
public void setComments(Set<Comment> comments) {
    this.comments = comments;
}
}

@Entity
public class Comment extends AbstractEntity {

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "beacon_id")
private Beacon beacon;

public Beacon getBeacon() {
    return beacon;
}

public void setBeacon(Beacon beacon) {
    this.beacon = beacon;
}
}

拥有存储在数据库中的评论的信标,我想删除评论,但它不起作用。我没有得到例外,但实体仍然存在于数据库中。

这是我的单元测试:

 @Test
public void deleteWithStrategyCheck() {

    Beacon beacon = this.beaconRepository.save(createBeacon());

    Comment comment = this.commentRepository.save(createEntity());
    comment.setBeacon(beacon);
    comment = this.commentRepository.save(comment);

    this.commentRepository.delete(comment.getId());

    assertThat(this.commentRepository.exists(comment.getId())).isFalse();
    assertThat(this.beaconRepository.exists(beacon.getId())).isTrue();
    assertThat(this.beaconRepository.findOne(beacon.getId()).getComments()).doesNotContain(comment);
}

如果我通过sql语句删除注释,它就可以工作。

1 个答案:

答案 0 :(得分:2)

您需要在orphanRemoval = true映射中添加@OneToMany,并从parrent信标中删除评论。

如果你删除了注释而没有从parrent集合中删除它,你应该实际得到异常(除非你没有使用InnoDB存储引擎,(并且应该))。

beacon.getComments().remove(comment), 
然后

将完成工作。 (使用orphanRemoval你不需要调用EM.remove(注释)。没有它,你需要从集合中删除注释并调用EM.remove(注释)。