Mehrere Primär-Schlüssel-Tabelle - Hibernate NonUniqueObjectException

Ich habe eine Tabelle mit 2 Primärschlüsseln (also die Kombination aus beiden sollte eindeutig sein). Das schema ist wie folgt:

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

Wenn ich versuche zu bestehen gleichzeitig mehrere Datensätze, bekomme ich diese überwintern Ausnahme:

Verursacht durch:
javax.die Persistenz.PersistenceException:
org.hibernate.NonUniqueObjectException:
ein anderes Objekt mit der gleichen
Bezeichner Wert war schon
mit der Sitzung verknüpft:
[...InvoiceLog#110105269]

Also wenn ich den folgenden code verwenden, unten, bekomme ich die hibernate Ausnahme vor. Es funktioniert gut, wenn ich nur bestehen, einen Datensatz, versäumt es aber, wenn ich versuche, Sie zu bestehen, eine Kollektion wie das, was ich versuche zu tun.

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

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

Den hibernate-mapping-Klasse ist unter:

@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;
    }

}
InformationsquelleAutor Steve | 2011-06-01
Schreibe einen Kommentar