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 ?
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
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). –
Cool, ich werde es versuchen und lassen Sie es wissen ... – kukkuz