2016-04-21 11 views
2

ich die folgenden JSON als Eingabe haben:Hibernate ORM: Speichern der Eltern Entität Speichert die Kinder auch?

{ 
    "type": "Student", 
    "numOfPeople": "1", 
    "tenantMembers": [ 
    { 
     "firstName": "Chris", 
     "lastName": "C" 
    } 
    ], 
    "tenantDetails": { 
    "firstName": "John", 
    "lastName": "J", 
    "email" "[email protected]" 
    } 
} 

Ich möchte diese verwenden, um eine sparen zu tun:

tenantRepo.save(tenant); 

Dies sollte den Eltern „Mieter“ und die Kinder „TenantMembers“ und "speichern MieterDetails ".

Aber wenn ich es tue tut es mit NULL 'Mieter_IDs in den Kindern. (Wenn ich Fremdschlüssel in der DB habe gibt 'Mieter_ID' kann keine Null-Bedingung Ausnahme sein)

Meine Frage ist: Ist das in Hibernate möglich?

Meine Modelle:

Übergeordnete Klasse:

@Entity 
@Table(name = "tenant") 
public class Tenant { 

@GeneratedValue 
@Id 
private Long id; 

private String type; 

@Column(name = "num_of_people") 
private String numOfPeople; 

@OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private List<TenantMember> tenantMembers; 

@OneToOne(mappedBy = "tenant", cascade = CascadeType.ALL) 
private TenantDetails tenantDetails; 

TenantMember Kind Klasse:

@Entity 
@Table(name = "tenant_member") 
public class TenantMember { 
@GeneratedValue 
@Id 
private Long id; 

@ManyToOne 
@JoinColumn(name = "tenant_id") 
private Tenant tenant; 

@Column(name = "first_name") 
private String firstName; 

@Column(name = "last_name") 
private String lastName; 

TenanatDetails Kind Klasse:

@Entity 
@Table(name="tenant_details") 
public class TenantDetails { 
@GeneratedValue 
@Id 
private Long id; 

@OneToOne 
@JoinColumn(name = "tenant_id") 
private Tenant tenant; 

@Column(name = "first_name") 
private String firstName; 

@Column(name = "last_name") 
private String lastName; 

private String email; 

EDIT:

Dragan Bozanovic Vorschlag Anknüpfend versuchte @JsonIdentityInfo für die drei Tabellen:

@Entity 
@Table(name = "tenant") 
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Tenant { 


@Entity 
@Table(name="tenant_details") 
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class TenantDetails { 


@Entity 
@Table(name = "tenant_member") 
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class TenantMember { 

und hat folgendes zu speichern:

@RequestMapping(value = "/set", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public Tenant test(@RequestBody Tenant tenant) { 
    Tenant t = new Tenant(); 
    t.setType(tenant.getType()); 
    t.setNumOfPeople(tenant.getNumOfPeople()); 
    tenantRepo.save(t); 
    tenant.setId(t.getId()); 
    tenant.getTenantDetails().setTenant(tenant); 
    for(TenantMember member: tenant.getTenantMembers()) { 
     member.setTenant(tenant); 
    } 
    return tenantRepo.save(tenant); 
} 

Wäre dies der beste Ansatz sein, das ist möglich ?

Antwort

1

Hibernate speichert die untergeordneten Elemente (daher die Einschränkungsverletzung) aufgrund der von Ihnen angegebenen Kaskadierungsoptionen, speichert jedoch in Ihrem Fall nicht die Beziehungsinformationen (Join-Spaltenwert).

TenantMember und TenantDetails sind die Eigentümer der Vereinigung mit Tenant (mappedBy Attribute in den Assoziations Annotationen in Tenant).

Das bedeutet, dass Sie das tenant Feld in den TenantMember und TenantDetails Instanzen korrekt aktualisiert, weil Hibernate inverse Seite des Vereins ignoriert, wenn die Beziehung aufrechterhalten wird.

+0

Das ist gut zu wissen, ich habe versucht, es zum Funktionieren zu bringen .... Danke. Wie würden Sie vorschlagen, ich speichere die JSON empfangen - ich bin verwirrt darüber? – kukkuz

+0

Sie können dies entweder manuell tun (über die deserialisierten Objekte iterieren) oder in der Dokumentation des Frameworks nachlesen, das Sie für die Behandlung von JSON verwenden. Zum Beispiel mit Jackson können Sie es mit '@ JsonManagedReference' und' @ JsonBackReference' machen; Ein Beispiel finden Sie in diesem Tutorial (http://www.baeldung.com/jackson-biddiction-relationship-and-infinite-recursion). –

+0

Cool, ich werde es versuchen und lassen Sie es wissen ... – kukkuz