2017-06-20 63 views
0

我對Hibernate相對來說比較新。Hibernate JPA:如何在獲取父對象時獲取子對象;但只堅持父對象

的問題是如何當父對象是取取兩子對象和父對象;然而在持續時間期間,只能堅持子對象。

順便提一下,外鍵在數據庫級別相關聯。

與下面的代碼

Scenario1: 
    Criteria criteria = getCriteria(ParentObject.java); 
    criteria.add(Restrictions.eq("internalId", 123); 
    Collection result = new LinkedHashSet(criteria.list()); 
    List<ParentObject> resultSet = new ArrayList<>(result); 

    for(ParentObject parentObj : resultSet) { 

    parentObj.getChildObjects() --> Getting all associated Child Objects. 
    } 

然而

------------------- 
ParentObject.java 
------------------- 

private Integer internalId; 
private Set<ChildObject> childObjects = new HashSet<>(0); 
private Integer userId; 

//associated Setters as well. 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "InternalId", unique = true, nullable = false) 
public Integer getInternalId() { 
    return this.internalId; 
} 

@OneToMany(fetch = FetchType.EAGER, mappedBy = "parentObject") 
public Set<ChildObject> getChildObjects() { 
    return childObjects; 
} 


------------------- 
ChildObject.java 
------------------- 

private Integer internalRecordId; 
private Integer userId; 
private ParentObject parentObject; 

// associated setters and remaining getters. 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "userId", nullable = true) 
public ParentObject getParentObject() { 
    return parentObject; 
} 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "InternalId", unique = true, nullable = false) 
public Integer getInternalId() { 
    return this.internalId; 
} 

工作正常,如果想堅持子對象失敗。

ChildObject childObj = new ChildObject(); 
    childObj.setUserId(123456); 
    getSession().save(childObj); 

我明白,它需要一個父對象爲參照,但由於業務流程可能不需要父對象和空parentObject行應在DB,這個問題如何解決不持久?

回答

0

在雙向OneToMany關係中,很多「方面就是所謂的關係所有者,你的情況是ChildObject實體,關係所有者負責管理數據庫中的FK,因此你的子對象必須有它的父對象它堅持之前屬性正確填寫。
如果你沒有因爲某些原因於母公司的一個參考,你至少需要它的ID號,然後就可以加載它並將它設置爲你的孩子實例。這是REST API常見場景例如說你有創造特定父新的子項的終端資源。爲了做到這一點,你可能會做一些像POST http://server/restapi/parent/12/children - 在父ID爲12.插入新的孩子在java中你會得到子對象,所以你首先通過id獲取父母,然後簡化你把它設置給孩子。通過這種方式,ORM將正確表示db中的關係。
你也應該改變parent.getChildobjects懶抓取類型,以避免N + 1點的問題,重構你的搜索方法明確地獲取孩子在一個單一的查詢對象(而不是N作爲當前的implement執行)。
快樂黑客

+0

謝謝你的建議! –

+0

@SrinivasLakshman如果幫助你,請將答案標記爲「已接受」。 – yntelectual