当我持久化时,实体不会显示在列表视图中

时间:2009-09-02 21:39:15

标签: java jpa persistence seam

我正在尝试添加一个新实体,然后在成功提交后,将它们重定向到列表操作。

以下是我正在做的事情摘要:

@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
#############################################

2 个答案:

答案 0 :(得分:0)

如果我理解正确,当您调用save()时,在您开始新会话之前数据不会显示。 我想知道你在@Transactional上发生了什么事情,直到你开始新的对话才结束。没有它会有用吗?

答案 1 :(得分:0)

嗯,事实证明,当我创建offerSite对象时,我没有设置offer字段。因此,持久层决定尽管显式提取,但实际上并不需要命中数据库来填充列表。