看一下以下类(UNI Direction @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 会负责主键值分配。我已将 -1 设置为团队的 id,以便在玩家的 id 中共享其引用(调用 addPlayer 方法时),如下所示
@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 在保存球队及其球员后会在 Player 的 teamId 属性中丢失球队的 id 引用吗?
最佳答案
我不确定你所说的“维护引用”是什么意思?我也不太清楚你想在这里做什么......
您是否期望 Hibernate 使用新创建的 Team
实体的 TEAM_ID
(例如本例中的 1)来插入 Player
实例?如果是这样,您可以通过在 @JoinColumn 声明中将 insertable/updateable 指定为 false 来专门防止这种情况发生 - 您需要将它们移至 Player 类中的 getTeamId()
方法。
您能澄清一下您想要实现的目标吗?
关于java - Hibernate 在调用 save 后丢失了引用。你知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1474335/