Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate不会删除OneToMany上的孤立项_Hibernate_Jpa 2.0_Hibernate Mapping - Fatal编程技术网

Hibernate不会删除OneToMany上的孤立项

Hibernate不会删除OneToMany上的孤立项,hibernate,jpa-2.0,hibernate-mapping,Hibernate,Jpa 2.0,Hibernate Mapping,我有以下非常简单的一对多关系: 球队有一组球员: @Entity(name = "TEAM") @Access(AccessType.PROPERTY) public class Team{ private Integer id; private String name; private Set<Player> players ; @Id @Column(name = "id") public Integer getId() {

我有以下非常简单的一对多关系:

球队有一组球员:

@Entity(name = "TEAM")
@Access(AccessType.PROPERTY)
public class Team{
    private Integer id;
    private String name;
    private Set<Player> players ;

    @Id
    @Column(name = "id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "team_name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(cascade = {CascadeType.ALL},orphanRemoval=true)
    @JoinColumn(name = "TEAM_ID")
    public Set<Player> getPlayers() {
        return players;
    }

    public void setPlayers(Set<Player> players) {
        this.players = players;
    }       
}
我运行一个非常简单的代码:

Team team = createTeam(3) // creates team with 3 players ids={1,2,3}
session.saveOrUpdate(team);
...

private Team createTeam(int players) {
    Team team = new Team();
    team.setName("Bears");
    team.setId(1);
    for(int i=1 ; i<=players; ++ i){
        Player player = new Player();
        player.setId(i);
        player.setName("Player"+i);
        team.addPlayer(player);
    }
    return team;
}
希望孤儿玩家被删除,但我得到:

  • 休眠:从team team_uuwhere team_uu.id=
  • 休眠:从player player_uuwhere player_u.id=?中选择player_u.id,player_u.player_uname作为player2_1_u
  • 休眠:从player player_uuwhere player_u.id=?中选择player_u.id,player_u.player_uname作为player2_1_u
  • Hibernate:更新玩家集TEAM_ID=null,其中TEAM_ID=
  • Hibernate:更新玩家集TEAM_ID=?其中id=
  • Hibernate:更新玩家集TEAM_ID=?其中id=
这会使孤立玩家(id=3)断开连接,但不会被删除。。。
知道我做错了什么吗?

在两个实体的关系中添加mappedBy属性

在玩家中添加团队

// in Player.java
@ManyToOne(mappedBy="players")
private Team team;
//In Team.java
@OneToMany(cascade = {CascadeType.ALL},orphanRemoval=true,mappedBy="team")
    @JoinColumn(name = "TEAM_ID")
    public Set<Player> getPlayers() {
        return players;
    }
在播放器中使用MappeedBy

// in Player.java
@ManyToOne(mappedBy="players")
private Team team;
//In Team.java
@OneToMany(cascade = {CascadeType.ALL},orphanRemoval=true,mappedBy="team")
    @JoinColumn(name = "TEAM_ID")
    public Set<Player> getPlayers() {
        return players;
    }

如果希望将玩家作为删除孤立对象删除,则需要玩家释放对团队的引用并保存团队

您正在执行的操作如下:

  • 创建一个新的对象团队
  • 为球队提供3名队员
  • 坚持
之后,每个玩家行将包含一个FK到团队(id=1)

然后,代码创建一个具有相同id的新团队,并为2名玩家提供食物并保持

在这一点上,DB中仍然会有一个玩家引用了团队1

根据我的观点,每个不同的业务对象都应该有自己的业务密钥。如果您想覆盖团队1的玩家,您应该首先检索id=1的团队,然后提供玩家

private Team createTeam(int players) {
    Team team = session.get(Team.class, 1);
    if (team == null) {
       team = new Team();
       team.setName("Bears");
       team.setId(1);
    }
    team.clearPlayers();

    for(int i=1 ; i<=players; ++ i){
        Player player = new Player();
        player.setId(i);
        player.setName("Player"+i);
        team.addPlayer(player);
    }
    return team;
}

// Team.java
private void clearPlayers() {
   players.clear();
}
此外,集合是可变的,因此使用getPlayers()返回不可修改的集合:

private Set<Player> getPlayers() {
   return Collections.unmodifiableSet(players);
}
private Set getPlayers(){
返回集合。不可修改集合(玩家);
}
希望这能给你一些启示:)

你可以使用这个标签: @org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE\u孤儿)。所以你得到:

@OneToMany(cascade={CascadeType.ALL},orphanRemoving=true) @org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE\u孤儿)
@JoinColumn(name=“TEAM_ID”)

什么是
createTeam()
方法?它可能是相关的,也可能不是,但是我们在HSQLOK上测试它,但是我们可以看到
createTeam()
中的代码吗?刚刚用createTeam()更新了代码示例,没有理由使关联双向。无论如何,在双向关联中,只有一个边必须具有mappedBy属性,因为它的意思是:“查看另一端关联的映射”。
private void adddPlayer(Player player) {
   player.setTeam(this);
   players.add(player);
}

private void removePlayer(Player player) {
   player.setTeam(null);
   players.remove(player);
}
private Set<Player> getPlayers() {
   return Collections.unmodifiableSet(players);
}