JPA父子删除

时间:2010-01-13 15:02:52

标签: spring jpa parent-child

我有两个实体:

@Entity
public class Game implements Serializable{

@ManyToOne
@JoinColumn(name = "target_id")
protected GameObject target;
}

@Entity
public class GameObject implements Serializable {

@OneToMany(mappedBy = "target", cascade = CascadeType.ALL)
protected Collection<Game> games = new HashSet<Game>();    
}

在一次交易中,我从游戏对象中删除游戏。

@Transactional
public void deleteEntity(Object entity) {
    getEntityManager().remove(entity);
    getEntityManager().flush();
}

之后,当我尝试加载gameObject时,它已经删除了集合中的游戏。这个游戏只有id属性正确,rest为null。有什么不对,为什么这场比赛还在筹码?

1 个答案:

答案 0 :(得分:2)

因为您在游戏 GameObject 实体之间存在双向关系。当您删除游戏时,您只会切断关系的一方;你正在删除游戏 - &gt; GameObject在数据库中引用,但GameObject - &gt;游戏参考依旧。您的deleteEntity方法应该执行以下操作:

public void deleteEntity(Game game) {
    // WARNING - Untested code, only use as an example
    GameObject gameObject = game.getGameObject();
    gameObject.removeFromCollection(game);
    getEntityManager().remove(game);
    getEntityManager().merge(gameObject);
}

您的底层数据库可能支持外键约束。这意味着当您的JPA实现尝试从数据库中删除游戏记录时,GameObject表在游戏表上的外键约束将不会允许删除记录,但它< strong>会允许所有列值的归零(当然主键/ id除外)。