2017-06-20 66 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