【问题标题】:Hibernate sets ID to nullHibernate 将 ID 设置为 null
【发布时间】:2013-02-18 23:27:35
【问题描述】:

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

这是我的两个实体:

@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 更新数据库,Hibernate 出于某种原因,将 token 字段设置为 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。

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: hibernate jakarta-ee jpa


    【解决方案1】:

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

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

    在很多方面:

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

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

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

    【讨论】:

    • 你说得对——问题出在映射上。谢谢!
    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多