2017-04-03 4 views
0

Ich möchte eine neue untergeordnete Datensätze einfügen, wo Eltern-Beziehungen bereits in der Datenbank vorhanden ist, ohne zuerst das übergeordnete Element durch Abfrage abrufen und dann das neue untergeordnete einfügen.Hibernate speichern untergeordnete Entität ohne Eltern einfügen

Beispiel: Ich habe ein Produkt Einheit, die eine ManyToOne mit einer bestehenden Katalog Einheit hat:

@NotNull 
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "catalog_id", 
    referencedColumnName = "id", foreignKey = @ForeignKey(name = "FK_product_catalog")) 
private Catalog catalog; 

Ich mag erste Abfrage ein neues Produkt in einem Katalog einfügen zu können, ohne dass der Katalog, um die neue Produkteinheit zu füllen.

Tatsächlich erhalte ich einen JSON in einem POST in einem RestController, der JSON enthält das Produktattribut und die Katalog-ID. Hier

ist die Json:

{ 
    "id":1, 
    "attribute1":"value", 
    "catalog":{"id":1} 
} 

Sobald Serialisierung auftritt, wird die Produktinstanz eine Instanz korrekt Catalog gebildet enthält, die nur das ID-Feld Wert haben.

Ich erhalte diese Meldung auf einfügen:

Den Versuch, ein oder mehr Objekte zu speichern, die eine Nicht-Nullable- Verbindung mit einer nicht gesicherten transienten Einheit

Ich verstehe, warum ich erhalten haben Mit dieser Nachricht könnte ich auch die Catalog-Zeile aus der Datenbank holen, aber das würde bedeuten, dass ich alle Eltern jedes Mal abfragen muss, wenn ich eine untergeordnete Zeile einfüge, was überhaupt keinen Sinn ergibt, da ich wirklich nur eine Zeile mit einem Fremdschlüssel einfüge Verweise.

Weiß jemand, wie man dieses Verhalten verhindert?

Antwort

0

Warum erstellen Sie keine separate Eigenschaft für catalog_id und setzen dort die @NotNull-Einschränkung anstelle der Catalog-Objekteigenschaft?

+0

Ich wollte zunächst die Datenbank-ddl von Hibernate generiert haben, ich versuche immer noch, es auf diese Weise arbeiten zu lassen. Ich möchte auch, dass dieser Katalog eifrig abgerufen wird, wenn ich ein Produkt aus der Datenbank auswähle. Aber wenn ich ein Produkt einfüge, möchte ich nur, dass die catalogId in die Produktreihe eingefügt wird, ohne dass eine zusätzliche Auswahl für den Katalogteil ausgeführt wird. –

+0

Scheint wie eine sehr sehr standard Funktionalität für mich. Ich möchte eifrig auf select abholen, aber ich möchte nur die Produkteinheit einfügen und die Datenbank die Fremdschlüsselbeschränkung erzwingen lassen, wenn der Katalog nicht existiert. –

+0

Ich habe versucht, was Sie vorschlagen, und es löst das Problem. Indem ich die ManyToOne-Beziehung zu Catalog (mit insert und update = false) belasse und ein catalog_id-Feld hinzufüge, kann ich jetzt nur die Produkteinheit einfügen, indem ich nur die ID der übergeordneten Beziehungen habe. Duplikate in der Entity (mit dem Feld catalog.id und dem Feld catalod_id) können zwar auf lange Sicht zu Problemen führen, aber es ist besser als mehrere unbrauchbare Selects für Einfügungen. –

Verwandte Themen