我有一个问题,即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。
感谢任何帮助。
谢谢!
答案 0 :(得分:3)
我不相信你的映射是完全正确的。你可能应该:
@OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.ALL}, mappedBy = "game")
private Set<DealersCard>
并且在很多方面:
@ManyToOne
@JoinColumn(name="token")
private Game game;
然后从多方删除令牌字段,只有一个整数,即@Id。
确保在您向套装中添加新的DealerCards时,您可以在每个套装中设置游戏并将其添加到集合中。