持久化对象时出现NonUniqueObjectException

时间:2012-11-14 11:50:00

标签: java hibernate jpa

嗨大家我在尝试将数据库数组写入数据库时​​遇到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写了一个元素。此表中可能存在重复记录,并且没有pk。

2 个答案:

答案 0 :(得分:2)

您可能有多个具有相同payeename的项目。尝试定义另一个ID(例如,由payeenametransactionID组成的ID。)

答案 1 :(得分:2)

根据您的hibernate映射payeename是您的主键,这意味着数据库中每个payeename只能有一个条目,例外NonUniqueObjectException表示您正在尝试persist具有相同主键的另一行。

<强>解决方案

  1. 在插入之前,请确保数据库中没有包含主键的条目。

  2. 如果主键已存在而不是插入新记录,请进行更新。

  3. 希望它有所帮助。