我对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中保留,如何解决这个问题?
答案 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)。
快乐的黑客