我有两个实体:
@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。有什么不对,为什么这场比赛还在筹码?
答案 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除外)。