2009-09-02 3 views
0

Я пытаюсь добавить новый объект, а затем после успешного совершения перенаправлять его в действие списка.Когда я продолжаю, объект не отображается в виде списка

Вот краткое описание того, что я делаю:

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

} 

Вот часть offersite сущности, я думаю, что дает мне проблемы:

@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, который был только что добавлен. Информация 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

Ну, оказывается, что когда я создавал объекты OfferSite, я не настраивал поле предложения. Поэтому слой persistence решил, что, несмотря на явную выборку, на самом деле не нужно было бы ударять по базе данных, чтобы заполнить список.

0

Если вы правильно поняли, когда вы вызываете save(), данные не отображаются, пока вы не начнете новый разговор. Мне интересно, если у вас что-то происходит с @Transactional, который не заканчивается, пока вы не начнете новый разговор. Он работает без него?

+0

Это экономит предложение только штрафом без @Transactional, но оно по-прежнему не отображается. Предлагает конкретные вещи в списке OfferSites. –

+0

@Factory ("offerСити") public void findAllOfferSites() Я верю (на основе кода, показанного вами, я прав) этот метод получает только один раз для разговора, поэтому список сайтов предложений не обновляется до следующего разговора. –