1

次のクラスを見てください(UNIdirection @OneToMany)

@Entity
public class Team {

    private Integer id = -1;

    @Id
    @GeneratedValue
    public Integer getId() {
        return this.id;
    }

    private List<Player> playerList;


    @OneToMany
    @Cascade(CascadeType.SAVE_UPDATE)
    @JoinColumn(name="TEAM_ID", insertable=false, updateable=false)
    public List<Player> getPlayerList() {
        return this.playerList;
    }

    public void addPlayer(Player player) {
        player.setId(new PlayerId(getId(), getPlayerList().size()));

        playerList.add(player);
    }

}

addPlayerに注意してください:チームのIDとプレーヤーのteamIdは同じインスタンスを参照しているため、

AssertEquals(team.getId(), player.getPlayerId().getTeamId());

うまくいくはずですよね?

ジェネレーター戦略を宣言したため、Hibernateは-1の値を保存しません(デフォルトはauto)。識別子ジェネレーターが宣言されている場合、Hibernateは主キー値の割り当てを処理します。次のように、プレーヤーのID(addPlayerメソッドを呼び出す場合)で参照を共有するために、チームのIDに-1を割り当てました。

@Embeddable
public class PlayerId implements Serializable {

    private Integer teamId;

    private Integer playerIndex;

    // required no-arg constructor
    public PlayerId () {}

    public PlayerId(Integer teamId, Integer playerIndex) {
        this.teamId = teamId;
        this.playerIndex = playerIndex;
    }

    @Column(name="TEAM_ID", nullable=false)
    public Integer getTeamId() {
        return this.teamId;
    }

    @Column(name="PLAYER_INDEX", nullable=false)
    public Integer getPlayerIndex() {
        return this.playerIndex;
    }

    // getters and setters

    public boolean equals(Object o) {
        if(o == null)
            return false;

        if(!(o instanceof PlayerId))
            return false;

        PlayerId other = (PlayerId) o;
        if(!(getTeamId().equals(other.getTeamId()))
            return false;

        if(!(getPlayerIndex().equals(other.getPlayerIndex()))
            return false;

        return true;
    }

}

しかし、私が電話するとき(addPlayerを特別に見てください)

Team team = new Team();

Player player = new Player();

// teamId property in PlayerId references Team id
team.addPlayer(player);

session.save(team);

そして、私は私が得るデータベースを見る

PLAYER
TEAM_ID     PLAYER_INDEX
-1          0

TEAM
ID
1

そして保存後に比較すると

AssertEquals(team.getId(), player.getPLayerId().getTeamId()); // It does not works! why ?

ログ出力

INSERT INTO TEAM VALUES()

// SELECT BEFORE SAVING OR UPDATING WHEN USING A COMPOUND PRIMARY KEY
SELECT * FROM PLAYER WHERE TEAM_ID = ? AND PLAYER_INDEX = ?

INSERT INTO PLAYER (TEAM_ID, PLAYER_INDEX) VALUES (?, ?)

では、チームとそのプレーヤーを保存した後、HibernateがプレーヤーのteamIdプロパティでチームのID参照を失った理由を知っていますか?

4

1 に答える 1

1

「参照を維持する」とはどういう意味かわかりませんか?また、あなたがここで何をしようとしているのかよくわかりません...

Hibernateがインスタンスを挿入するためTEAM_IDに新しく作成されたTeamエンティティ(この場合は1など)を使用することを期待しましたか?Playerその場合は、@JoinColumn宣言でinsertable/updatableをfalseとして指定することで、これが発生しないようにしますgetTeamId()。代わりに、Playerクラス内のメソッドに移動する必要があります。

ここで達成しようとしていることを明確にできますか?

于 2009-09-24T21:56:00.983 に答える