Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JPA:如何在获取父对象时获取子对象;但是,只保留父对象_Hibernate_Jpa - Fatal编程技术网

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

Hibernate JPA:如何在获取父对象时获取子对象;但是,只保留父对象,hibernate,jpa,Hibernate,Jpa,我对冬眠还比较陌生 问题是在获取父对象时如何同时获取子对象和父对象;但是,在持久化期间,只持久化子对象 通过By,外键在数据库级别不关联 ------------------- ParentObject.java ------------------- private Integer internalId; private Set<ChildObject> childObjects = new HashSet<>(0); private Integer userId;

我对冬眠还比较陌生

问题是在获取父对象时如何同时获取子对象和父对象;但是,在持久化期间,只持久化子对象

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

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

我知道它需要一个父对象作为引用,但是,由于业务流可能不需要父对象,并且空的parentObject行不应该保留在数据库中,如何解决这个问题呢?

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

Happy Hack

@SrinivasLakshman如果答案对您有帮助,请将其标记为已接受。
 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.
  }
   ChildObject childObj = new ChildObject();
   childObj.setUserId(123456);
   getSession().save(childObj);