Hibernate将ID设置为null

时间:2013-02-18 23:27:35

标签: hibernate java-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="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   列“token”中的值违反非空约束详细信息:失败   row包含(null,0)。

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

感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

并且在很多方面:

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

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

确保在您向套装中添加新的DealerCards时,您可以在每个套装中设置游戏并将其添加到集合中。