2017-04-13 65 views
0

我在使用Spring數據將以下提供的實體存儲到數據庫時遇到問題。 OneToOne關係在這兩者之間使用。它僅在parentObject被顯式設置爲childObject時有效。這不是一個好的解決方案,因爲我希望該子對象根本沒有父對象。有沒有可能? 非常相關的問題張貼hereOneToOne與共享ID的關係需要孩子知道父母

@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; 
} 
} 

不過,我真的不喜歡parentObject設置爲ChildObject:

ChildObject childObject = new ChildObject("name"); 
ParentObject parentObject = new ParentObject(12L, childObject); 
childObject.setParentObject(parentObject); 

這是有共享ID的唯一途徑?如果沒有明確設置parentObject,然後下面的錯誤被拋出:

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] 
+0

我已經從ChildObject類中刪除了parentObject字段,添加了@JoinColumn(name =「child_id」)private ParentObject childObject to parentObject,並且移除了mappedBy。我可能錯過了一些東西,因爲在給出建議後拋出以下錯誤: 引起:org.hibernate.id.IdentifierGenerationException:在調用save()之前必須手動分配此類的ids: –

回答

1

您可以輕鬆地封裝操作,以便不要求有問題的電話:事實上,你應該總是這樣做是爲了你的內存模型是始終一致的狀態:

public class ParentObject{ 

    public ParentObject(Long age, ChildObject childObject) { 
     this.age = age; 
     this.childObject = childObject; 

     childObject.setParentObject(this); 
    } 

    public void setChildObject(ChildObject childObject) { 
     this.childObject = childObject; 
     childObject.setParentObject(this); 
    } 
} 

現在,您的Domain Model API的客戶端不需要知道任何關於後退引用窗體Child to Parent的信息。

ChildObject childObject = new ChildObject("name"); 
ParentObject parentObject = new ParentObject(12L, childObject); //all relationships now set correctly 
1

既然你有雙向關係(你必須在雙方OneToOne註解),你需要保持在另一側的關係中每一側的參考,如果你不喜歡,你可以通過從一邊刪除引用和映射來將關係變成單向關係。

+0

好吧,目的是得到單向關係。在子類中@Id @Column(name =「child_id」,unique = true,nullable = false) private Long id; 在父類中:@OneToOne(orphanRemoval = true,cascade = CascadeType.ALL) @JoinColumn(name =「child_id」) private ChildObject childObject; 但是錯誤是通過以下方式來檢測的:org.hibernate.id.IdentifierGenerationException:在調用save()之前必須手動分配此類的id() –

+0

如果關係是單向的,則不應在關係的每一側都有引用,例如使關係單向從ParentObject到ChildObject,您需要刪除ChildObject中的ParentObject引用 –

相關問題