Hibernate将ID设置为空

Hibernate将ID设置为空,hibernate,jakarta-ee,jpa,Hibernate,Jakarta Ee,Jpa,我有一个问题,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="

我有一个问题,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;
    }

}
当我使用EntityManager::persist分配的两个DealersCard创建游戏实例时,对象在数据库中正确创建,我可以稍后检索它们,但如果检索到游戏实例,请添加另一个DealersCard实例,并尝试使用EntityManager::merge,Hibernate更新数据库,因为某些原因,将令牌字段设置为null,id设置为0,然后我得到

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

我尝试了MySQL和PostgreSQL,但仍然遇到相同的错误。我正在运行Glassfish 3.1.2.2、Hibernate实体管理器4.1.2和JavaEE6

感谢您的帮助


谢谢

我不相信您的映射是正确的。您可能应该:

@OneToMany(fetch=FetchType.EAGER,  cascade={CascadeType.ALL}, mappedBy = "game")
private Set<DealersCard>
然后从many端删除token字段,只需要一个整数,即@Id


确保在向集合中添加新的DealerCard时,在每一张上都设置了游戏,并将其添加到集合中。

我不确定您的映射是否完全正确。您可能应该:

@OneToMany(fetch=FetchType.EAGER,  cascade={CascadeType.ALL}, mappedBy = "game")
private Set<DealersCard>
然后从many端删除token字段,只需要一个整数,即@Id


确保在向集合中添加新的DealerCard时,您在每一张上都设置了游戏,并将其添加到集合中。

您完全正确-问题在于映射。谢谢你完全正确-问题在于映射。谢谢
@ManyToOne
@JoinColumn(name="token")
private Game game;