我正在尝试添加一个新实体,然后在成功提交后,将它们重定向到列表操作。
以下是我正在做的事情摘要:
@Name("offerAction")
@Scope(ScopeType.CONVERSATION)
public class OfferAction implements Serializable {
@In private EntityManager entityManager;
private List<OfferSite> offerSites;
@Factory("offerSites") public void findAllOfferSites() {
offerSites = entityManager.createQuery("select os from OfferSite os " +
"inner join fetch os.offer o " +
"inner join fetch os.site s " +
"inner join fetch o.store st " +
"inner join fetch os.offer.offerType ot").getResultList());
}
private Offer instance;
@Begin(join = true, flushMode = FlushModeType.MANUAL)
public String createOffer() {
instance = new Offer();
createSupportMap();
return EDIT_VIEW;
}
@End public String save() {
persist();
findAllOfferSites();
return LIST_VIEW;
}
@Transactional void persist() {
entityManager.persist();
/* goes through and persists each site and the metadata associated with each offer-site pair. */
persistOfferSites();
entityManager.flush();
entityManager.refresh(instance);
}
}
以下是我认为给我提出问题的优惠实体的一部分:
@Entity
@Table(name = "t_offer_site")
public class OfferSite {
@Embeddable
public static class Id implements Serializable { /* Long offerId, Long siteId */ }
@EmbeddedId
private Id id = new Id();
@ManyToOne
@JoinColumn(name = "offer_id", insertable = false, updatable = false)
private Offer offer;
}
/* assume getters/setters */
}
这正确地保存了Offer对象(及其OfferSite元数据),但是当我查看findAllOfferSites()结果显示的表时,它缺少刚刚添加的OfferSite对象的Offer数据。 OfferSite信息显示就好了!完全开始新对话后,数据会显示。
#############################################
# Offer Id # Store Name # Start Date # Site #
#############################################
# 1 # Store 1 # 1/1/09 # 1 #
# 1 # Store 1 # 1/2/09 # 2 #
# # # 1/1/09 # 1 # <- NEWLY INSERTED ROW
#############################################
答案 0 :(得分:0)
如果我理解正确,当您调用save()时,在您开始新会话之前数据不会显示。 我想知道你在@Transactional上发生了什么事情,直到你开始新的对话才结束。没有它会有用吗?
答案 1 :(得分:0)
嗯,事实证明,当我创建offerSite对象时,我没有设置offer字段。因此,持久层决定尽管显式提取,但实际上并不需要命中数据库来填充列表。