I have a problem while storing below provided entity to the database using Spring data. OneToOne relation is used between those two. It works only when parentObject is explicitly set to childObject. This is not a nice solution as I would like that child object didn't have parent at all. Is it possible or not? The very related question is posted here
@Entity
@Table(name = "parent_object")
public class ParentObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column(name = "age")
private Long age;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "parentObject")
private ChildObject childObject;
public ParentObject() {
}
public ParentObject(Long age, ChildObject childObject) {
this.age = age;
this.childObject = childObject;
}
public Long getId() {
return id;
}
public Long getAge() {
return age;
}
public ChildObject getChildObject() {
return childObject;
}
public void setChildObject(ChildObject childObject) {
this.childObject = childObject;
}
}
@Entity
@Table(name = "child_object")
public class ChildObject {
@Id
@Column(name = "child_id", unique = true, nullable = false)
private Long id;
@MapsId
@OneToOne
@JoinColumn(name = "child_id")
private ParentObject parentObject;
@Column(name = "name")
private String name;
public ChildObject() {
}
public ChildObject(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public ParentObject getParentObject() {
return parentObject;
}
public String getName() {
return name;
}
public void setParentObject(ParentObject parentObject) {
this.parentObject = parentObject;
}
}
However, I really don't like to set parentObject to ChildObject:
ChildObject childObject = new ChildObject("name");
ParentObject parentObject = new ParentObject(12L, childObject);
childObject.setParentObject(parentObject);
Is this the only way to have shared id? If parentObject is not set explicitly, then following error is thrown:
Caused by: org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [test.ChildObject.parentObject]
at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:83) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]