エンティティの ID を明示的に設定しても、Hibernate がエンティティの ID をリセットするという問題があります。
ここに私の2つのエンティティがあります:
@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 を介して割り当てられた 2 つの DealersCard を使用して Game のインスタンスを作成すると、オブジェクトがデータベースに正しく作成され、後でそれらを取得できますが、Game のインスタンスを取得する場合は、DealersCard の別のインスタンスを追加して更新を試みます。 EntityManager::merge、Hibernate を使用したデータベースは、何らかの理由でトークン フィールドを null に設定し、id を 0 に設定すると、
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: エラー: 列 "token" の null 値が not-null 制約に違反しています 詳細: 失敗した行に (null, 0) が含まれています。
MySQL と PostgreSQL を試しましたが、それでも同じエラーが発生します。Glassfish 3.1.2.2、Hibernate Entity Manager 4.1.2、Java EE 6 を実行しています。
どんな助けでも大歓迎です。
ありがとう!