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