嗨大家我在尝试将数据库数组写入数据库时遇到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。
答案 0 :(得分:2)
您可能有多个具有相同payeename
的项目。尝试定义另一个ID(例如,由payeename
和transactionID
组成的ID。)
答案 1 :(得分:2)
根据您的hibernate映射payeename
是您的主键,这意味着数据库中每个payeename
只能有一个条目,例外NonUniqueObjectException
表示您正在尝试persist
具有相同主键的另一行。
<强>解决方案强>:
在插入之前,请确保数据库中没有包含主键的条目。
如果主键已存在而不是插入新记录,请进行更新。
希望它有所帮助。