Hibernate JPA:如何在获取父对象时获取子对象;但是只保留父对象

时间:2017-06-20 16:57:39

标签: hibernate jpa

我对Hibernate比较陌生。

问题是如何在获取父对象时获取子对象和父对象;但是在持久化时间内,只保留子对象。

通过,外键在数据库级别关联 NOT

function confirmationEmail(e) {
  var sheet = SpreadsheetApp.getActiveSheet('BIKE2')
  var orderNumber = e.values[2];
  var subject = "Order is Ready to be Confirmed";
  var body = "An order from the bike shop is ready to be confirmed! Order Number: " + orderNumber;
  if (e.values[14] && e.values[1] == 'Order Entry')
  {
    MailApp.sendEmail("dylan.bassett@activesportsinc.com", subject, body);
  }
}

使用以下代码正常工作

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

但是,如果尝试仅保留 子对象,则会失败。

 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-row不应该在DB中保留,如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在双向oneToMany关系中,许多“方面是什么叫做关系的所有者。在你的情况下是ChildObject实体。关系的所有者负责管理数据库中的FK。因此你的子对象必须在保留之前正确填充其父属性 如果由于某种原因没有对父级的引用,则至少需要它的Id,然后可以加载它并将其设置为子实例。这是REST api的常见场景。假设您有一个端点资源,用于为特定父级创建新的子项。为了做到这一点,你可能会做类似POST http://server/restapi/parent/12/children的事情 - 在id为12的父元素中插入新的子元素。在java中你将获得子对象,所以你首先通过id获取父元素,然后简单地将它设置为孩子这样ORM就能正确表示db中的关系 您还应该将parent.getChildobjects上的fetch类型更改为Lazy以避免N + 1问题并重构您的搜索方法以在单个查询中显式获取子对象(而不是N作为当前impl)。
快乐的黑客