0

私はこのエンティティを持っています:

@Entity
@Table(name="AA_CHARGE")
public class Charge2 extends AbstractProduct implements Serializable {

    private static final long serialVersionUID = 1L;

    private String currency;

    private String chargeType;

    @OneToMany(mappedBy = "charge")
    private Set<Rate2> chargeRates;

    ...
}

public class Rate2 implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="RATE_ID")
    private String id;

    private Date startDate;

    private Date endDate;

    private BigDecimal rate;

    private String templateType;

    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="CHARGE_ID")
    private Charge2 charge;

    ...
}

ChargeRates コレクションの要素のみを持つ指定されたCharge オブジェクト(たとえば、ID A) があり、これはデータベースに保存されます。

この状況の後、別のオブジェクトを読み取り、同じ料金を取得しますが、chargeRates コレクションは equals ではありません。(たとえば、ID B の料金があります)。

休止状態で Charge を更新し、chargeRates に 2 つの要素を配置する必要がありますか? この後、データベースでクエリを実行すると、「同じ識別子の値を持つ別のオブジェクトが既にセッションに関連付けられていました」というエラーが表示されました

請求IDは同じですが、なぜこの状況で休止状態がこのエラーを出すのですか? ありがとう

4

1 に答える 1

1

Hibernate は既存の料金オブジェクトを更新しません。休止状態セッションに既にアタッチされている既存の料金オブジェクトを更新していないためです。新しい課金オブジェクトを作成したため、 2 つのオブジェクトのハッシュ コードが同じではないため、コンテンツが既にアタッチされているものと似ているかどうかはわかりません。その結果、例外が発生しました。

解決策:
2 番目のオブジェクトが前のオブジェクトに似ていることがわかった場合。新しい chargeRate オブジェクトは、以前の料金オブジェクトのリストにのみ追加できます。次に、オブジェクトを更新します (変更はデータベースに反映されます)。

于 2012-11-19T13:33:21.440 に答える