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