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;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre aktuelle mapping ist eine einzige Id, invoiceNumber, nicht ein zusammengesetzter Schlüssel ist. Als solche, es wird verlangen, dass der invoiceNumber eindeutig sein, nicht die Kombination, die Sie wollen. Das ist es, was die Ausnahme ist, sagen Sie, es ist zu merken, den Sie versuchen zu speichern, einen zweiten Datensatz mit dem gleichen Id-Wert.
Müssen Sie die Karte, die zwei Felder einen zusammengesetzten Schlüssel. Es sieht von Ihrem auskommentieren der zweiten
@Id
dass du in diese Richtung gehen, irgendwann. Hier ist die Dokumentation auf Methoden zur Abbildung des zusammengesetzten Schlüssels.