java - Hibernate 在调用 save 后丢失了引用。你知道为什么吗?

标签 java hibernate orm mapping pass-by-reference

看一下以下类(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/

相关文章:

java - java信号量的问题

java - 将字节转换为枚举

java - 如何使用 Spring Data REST 的多态关联

java - 如何修复 "Duplicate property mapping"异常?

c# - C# 中的反射生成 SQL?

java - 为什么 Spring 在混淆后看不到我的 @Resource 注解的对象?

java - 防止矩形重叠

java - 如何定义复合主键?

entity-framework - SQL 方言实际上如何在 hibernate 和 JOOQ 等框架中内部工作

mysql - 外键和基本关系表