0

エンティティの 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 を実行しています。

どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

3

あなたのマッピングが完全に正しいとは確信していません。おそらく次のものが必要です。

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

そして多くの側で:

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

次に、多側からトークン フィールドを削除し、@Id である整数だけを取得します。

セットに新しい DealerCards を追加するときは、それぞれにゲームを設定し、コレクションに追加するようにしてください。

于 2013-02-18T23:48:24.863 に答える