0

我有一个问题,即使我明确设置了实体,Hibernate 也会重置实体的 ID。

这是我的两个实体:

@Entity
@Table(name="game")
public class Game implements Serializable {

    private String token;

    private Set<DealersCard> dealersCards;

    @Id
    @Size(min=36, max=36)
    @Column(name="token")
    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }


    @OneToMany(fetch=FetchType.EAGER,  cascade={CascadeType.ALL})
    public Set<DealersCard> getDealersCards() {
        return dealersCards;
    }

    public void setDealersCards(Set<DealersCard> dealersCards) {
        this.dealersCards = dealersCards;
    }

}

@Entity
@Table(name="dealers_card")
public class DealersCard implements Serializable {

    private String token;
    private int id;

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    @ManyToOne
    @MapsId("token")
    @JoinColumn(name="token", referencedColumnName="token")
    public Game getGame() {
        return game;
    }

    public void setGame(Game game) {
        this.game = game;
    }

    @Id
    @Size(min = 36, max = 36)
    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    @Id
    public int getId() {
        return id;
    }

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

当我使用通过 EntityManager::persist 分配的两个 DealersCard 创建 Game 的实例时,对象会在数据库中正确创建,我可以稍后检索它们,但是如果我检索 Game 的实例,请添加 DealersCard 的另一个实例并尝试更新具有 EntityManager::merge 的数据库,休眠,出于某种原因,将令牌字段设置为 null 并将 id 设置为 0,我得到

javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:错误:“令牌”列中的空值违反非空约束详细信息:失败行包含(null,0)。

我尝试了 MySQL 和 PostgreSQL,但仍然遇到同样的错误。我正在运行 Glassfish 3.1.2.2、Hibernate Entity Manager 4.1.2、Java EE 6。

任何帮助表示赞赏。

谢谢!

4

1 回答 1

3

我不相信你的映射是完全正确的。你可能应该有:

@OneToMany(fetch=FetchType.EAGER,  cascade={CascadeType.ALL}, mappedBy = "game")
private Set<DealersCard>

在许多方面:

@ManyToOne
@JoinColumn(name="token")
private Game game;

然后从多方面删除令牌字段,并只有一个整数,即您的@Id。

确保当您将新的 DealerCards 添加到您的集合时,您在每张卡片上都设置了游戏并将它们添加到集合中。

于 2013-02-18T23:48:24.863 回答