0

こんにちは皆さん、オブジェクトの配列をデータベースに書き込もうとすると、Hibernate で問題が発生します。必須 Web サービス クエリから構築されたオブジェクトがあります。このオブジェクト「応答」には、最大 10 個の「未払いのアイテム」を含めることができます。これらを永続化しようとすると、問題が発生します。

実在物:

@Entity
@Table(name="TABLE_NAME")
public class AccountDetailsRROutput implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id

    private String payeename;

    private String typeunpd;

    private BigDecimal unpdamt;

    @Column(name="TRANSACTION_ID")
    private long transactionId;

    public AccountDetailsRROutput() {
        super();
    }

    // plus all get/sets
}



        //================================================================
        //  Populate the output for the repeating rows table
        //  which can contain a maximum of 10 unpaid items
        //===============================================================
        AccountDetailsRROutput outputRRTable[] = new AccountDetailsRROutput[response.getLineItems().length];

        LOGGER.debug(METHOD_NAME, "Loop through the line items");
        for (int i = 0; i < response.getLineItems().length; i++) {

            //================================================================
            //  Ensure that we have an item so we don't write an empty row
            //================================================================
            if (response.getLineItems()[i].getTypeunpd() == null || response.getLineItems()[i].getTypeunpd() == "") {
                LOGGER.debug(METHOD_NAME, "No unpaid item entry so break out of the the loop");
                break;
            }
            else {
                LOGGER.debug(METHOD_NAME, "We've got an unpaid item so add the details to the DB");

                outputRRTable[i] = new AccountDetailsRROutput();

                outputRRTable[i].setTransactionId(iTransactionID);
                outputRRTable[i].setTypeunpd(response.getLineItems()[i].getTypeunpd());
                outputRRTable[i].setPayeename(response.getLineItems()[i].getPayeeName());
                outputRRTable[i].setUnpdAmt(response.getLineItems()[i].getUnpdAmt());

                //================================================================
                //  Persist the output list DB object
                //================================================================
                LOGGER.debug(METHOD_NAME, "Persist repeating rows table DB object for line item: " + (i+1));
                em_i.persist(outputRRTable[i]);             
            }
        }
    LOGGER.debug(METHOD_NAME, "Finished persisting repeating rows table DB object");
    em_i.flush();

これを試すと、次のエラーが表示されます。

org.hibernate.NonUniqueObjectException: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられていました:

emi.persist を emi.merge に変更することでこれを回避できますが、db に 1 つの要素しか書き込んでいません。このテーブルには重複レコードが存在する可能性があり、pk はありません。

4

2 に答える 2

2

休止状態のマッピングpayeenameは主キーであるため、データベースごとに 1 つのエントリしか存在できないことを意味payeenameします。例外は、同じ主キーで別の行をNonUniqueObjectException試行していることを示しています。persist

解決策:

  1. 挿入する前に、主キーを持つエントリがデータベースにないことを確認してください。

  2. 新しいレコードを挿入する代わりに主キーが既に存在する場合は、更新を行います。

それが役に立てば幸い。

于 2012-11-14T12:01:12.757 に答える