删除多对一关系Hibernate中的单个条目

时间:2014-06-06 19:13:10

标签: java hibernate jpa

public class User {

    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)
    long userId;

    String name;    

    @OneToMany(cascade = CascadeType.REMOVE)
    List<Player> playerList = new ArrayList<>();
}   

public class Player {

    @Id  
    @GeneratedValue(strategy = GenerationType.AUTO)
    long playerId;

    String team; 

    @ManyToOne
    User user;
}

用户可以拥有多个玩家。
我想删除单个玩家,即来自玩家表[1条目],user_player [1条目]表的引用。

请帮助,我怎么能不使用HQL。

User u = new User(); 
u.name = "George"; 
Player p1 = new Player(); 
p1.team = "india"; 
Player p2 = new Player(); 
p2.team = "us"; 
session.beginTransaction(); 
session.save(u); 
session.save(p1); 
session.save(p2); 
session.getTransaction().commit(); 

现在我想删除p1,但是如果我使用session.delete,则会留下user_player表中的一个引用。我不想删除整个用户。谢谢你的回复

1 个答案:

答案 0 :(得分:2)

如果您将级联更改为cascade-all,这一切都变得更加简单。您有一个聚合对象,您应该只对聚合根执行数据库操作,在您的情况下为User。因此,您应该从User添加和删除播放器,并仅保存。然后保存将级联到玩家。如果您从用户中删除播放器,然后保存用户,播放器将被hibernate删除。要实现这一目标,您必须在addPlayer(Player player)类中使用User方法将播放器添加到集合中,并在setUser(User user)类上添加Player方法,从addPlayer()内部调用。