Ich habe die SO gesucht und habe keine geeignete Lösung dafür gefunden. Sagen, dass ich eine Muttergesellschaft haben:Spring JPA merge übergeordnete Entität von neuen untergeordneten Entität
@Entity
public class Parent {
@Id
@GeneratedValue
private int id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<Child> childList;
}
Und ein Kind Einheit, die mit der Muttergesellschaft zugeordnet Fremdschlüssel haben:
@Entity
public class Child {
@Id
@GeneratedValue
private int id;
@JoinColumn(name = "parentId")
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Parent parent;
}
Mein Szenario etwas Besonderes ist. Die untergeordnete Entität wird jede Stunde in einer großen Menge generiert und ich müsste sie in der Datenbank speichern. Diese untergeordneten Objekte können dieselben übergeordneten Elemente haben, und die zugehörige übergeordnete Entität ist möglicherweise bereits in der Datenbank vorhanden. Meine Anforderung besteht darin, alle diese untergeordneten Objekte zu speichern, ohne die verwaltete übergeordnete Entität von entityManager abzufragen. Wenn die übergeordnete Entität vorhanden ist, muss nur die vorhandene übergeordnet werden. Wie zum Beispiel:
Child c = new Child();
// set some properties of child
Parent p = new Parent();
// set some properties from my data into the parent. The parent may already exists
child.setParent(p);
JpaRepo.saveAndFlush(child);// If parent already exists, merge with the existed parent object, otherwise, create new parent object.
Offenbar funktioniert das nicht. Wenn die übergeordnete Entität nicht vorhanden ist, wird die übergeordnete Entität korrekt erstellt und ihr zugeordnet. Aber wenn der Elternteil bereits existiert, wird eine Ausnahme über einen doppelten Schlüssel ausgelöst, und wenn ich die ID des Elternteils festlege (benutze einen Dummy-Wert, um die Fusion zu erzwingen), wird eine Ausnahme des gelöschten Entitätsobjekts ausgelöst.
Aufgrund der Leistungseinschränkung kann ich die übergeordnete Entität nicht aus der Datenbank laden, da zu viele davon vorhanden sind. Gibt es also eine Möglichkeit, JPA oder die Datenbank automatisch mit dem Objekt zu verbinden, wenn der Primärschlüssel verletzt wird?
Ich benutze MySQL, ist das möglich, ON DUPLICATE KEY UPDATE zu verwenden?
Haben Sie die Eltern-ID vor dem Speichern mit dem Child-Objekt verfügbar? –
Nein, ich habe keine ID, aber stattdessen habe ich alle Attribute, die als eindeutiger Schlüssel zur Identifizierung des Objekts verwendet werden können. – LynxZh