Таблица нескольких первичных ключей - Hibernate NonUniqueObjectException - PullRequest
1 голос
/ 01 июня 2011

У меня есть таблица с 2 первичными ключами (поэтому комбинация их обоих должна быть уникальной).Схема выглядит следующим образом:

TABLE="INVOICE_LOGS"
INVOICE_NUMBER  PK  non-null
INVOICE_TYPE    PK  non-null
AMOUNT  

Когда я пытаюсь сохранить несколько записей одновременно, я получаю следующее исключение гибернации:

Причина: javax.persistence.PersistenceException:org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом: [... InvoiceLog # 110105269]

Так что, если я использую следующий код ниже, я получаюСпящий режим исключение выше.Это работает нормально, если я сохраняю только одну запись, но не удается, если я пытаюсь сохранить коллекцию, как то, что я пытаюсь сделать.

    List<InvoiceLog> logs = getLogs();
    for(OvercounterLogDO log: logs) {
        persist(log);
    }

    public void persist(final Object entity) {
        entityManager.persist(entity);
        entityManager.flush();
    }

Класс отображения hibernate приведен ниже:

@Component(InvoiceLog.BEAN_NAME)
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Entity
@Table(name = "INVOICE_LOGS", uniqueConstraints = {@UniqueConstraint(columnNames = "INVOICE_NUMBER"),@UniqueConstraint(columnNames = "INVOICE_TYPE")} ) 
public class InvoiceLog implements java.io.Serializable {

    private static final long serialVersionUID = -7576525197897271909L;

    protected static final String BEAN_NAME = "invoiceLog";

    private long invoiceNumber;
    private String invoiceType;
    private Double amount;

    public InvoiceLog(){}

    public InvoiceLog(Integer invoiceNumber, String invoiceType,
            Double amount) {
        super();
        this.invoiceNumber = invoiceNumber;
        this.invoiceType = invoiceType;
        this.amount = amount;
    }

    @Id
    @Column(name = "INVOICE_NUMBER", unique = true, nullable = false, precision = 10, scale = 0)
    public long getInvoiceNumber() {
        return invoiceNumber;
    }
    public void setInvoiceNumber(long invoiceNumber) {
        this.invoiceNumber = invoiceNumber;
    }

//  @Id
    @Column(name = "INVOICE_TYPE", nullable = false, length = 4)
    public String getInvoiceType() {
        return invoiceType;
    }
    public void setInvoiceType(String invoiceType) {
        this.invoiceType = invoiceType;
    }

    @Column(name = "AMOUNT", nullable = false, length = 12)
    public Double getAmount() {
        return amount;
    }
    public void setAmount(Double amount) {
        this.amount = amount;
    }

}

1 Ответ

3 голосов
/ 01 июня 2011

Ваше текущее отображение имеет один идентификатор, invoiceNumber, а не составной ключ. Таким образом, он потребует, чтобы invoiceNumber был уникальным, а не комбинация, которую вы хотите. Это то, что говорит вам исключение, оно замечает, что вы пытаетесь сохранить вторую запись с тем же значением Id.

Вам необходимо сопоставить два поля как составной ключ. Из вашего комментария ко второму @Id видно, что вы в какой-то момент шли в этом направлении. Вот документация о методах сопоставления составного ключа.

...