2013-08-19 1 views
1

мне нужна ваша помощьEJB, JPA, JSF, почему не может получить новый боб для просмотра

  1. У меня есть ManagedBean

    @ManagedBean 
    @SessionScoped 
    public class ComponentController implements Serializable { 
    private static final long serialVersionUID = 373631006594351707L; 
    @EJB 
    IComponentService componentService; 
    @EJB 
    IDocumentService documentService; 
    private Component component; 
    private DocumentEntity document; 
    
    
    
    public String createAndClose() { 
        componentService.save(component); 
        FacesMessage msg = new FacesMessage("Component added.", null); 
        FacesContext.getCurrentInstance().addMessage(null, msg); 
        component = new Component(); 
        return "components"; 
    } 
    
    public String saveAndClose() { 
        componentService.update(component); 
        FacesMessage msg = new FacesMessage("Component updated.", null); 
        FacesContext.getCurrentInstance().addMessage(null, msg); 
        component = new Component(); 
        return "components"; 
    } 
    
    public String createView() { 
        component = new Component(); 
        return "create"; 
    } 
    
    } 
    
  2. У меня есть базовый сервис дао как этот

    public abstract class GenericJpaService<T extends BaseEntity, ID extends Serializable> implements IGenericService<T, ID> { 
    
        @PersistenceContext 
        EntityManager em; 
        private Class<T> persistentClass; 
    
        public GenericJpaService() { 
        } 
    
        public GenericJpaService(Class<T> persistentClass) { 
         this.persistentClass = persistentClass; 
        } 
    
        public Class<T> getPersistentClass() { 
         return persistentClass; 
        } 
    
        public void setPersistentClass(Class<T> persistentClass) { 
         this.persistentClass = persistentClass; 
        } 
    
        @Override 
        public T save(T entity) { 
         this.em.persist(entity); 
         this.em.flush(); 
         this.em.refresh(entity); 
         Logger.getLogger(GenericJpaService.class.getName()).log(Level.INFO, "Object {0} saved to DB", entity); 
         return entity; 
        } 
    
        @Override 
        @SuppressWarnings("unchecked") 
        public T update(T entity) { 
         Logger.getLogger(GenericJpaService.class.getName()).log(Level.INFO, "Object {0} updated in DB", entity); 
         return (T) this.em.merge(entity); 
        } 
    ... 
    } 
    
  3. Так что, когда я запускаю приложение, первым я нажимаю на какой-то ссылку Добавление компонента. Это выполнение:

общественного Струнный CreateView()

  1. добавить туда некоторые данные + загрузить некоторые файлы и т.д. ...
  2. Затем я нажимаю сохранить и закрыть кнопку. Это выполнение:

общественного Струнный createAndClose()

  1. успешно это сохранить мои данные в базу данных.

И вот проблема, когда я делаю это снова, покажу мне данные, которые я сохраняю до этого. Я отлаживаю его, но я не понимаю, где он установлен. После

Струнный CreateView общественности()

это Шоуда принять новый компонент() для страницы JSF. Итак, где я ошибаюсь? Что я до сих пор не понимаю? Может быть, я использую Hibernate вместо простой JPA? Я использую его (Hibernate) раньше, чем было проще (с HibernateUtil).

PS. Извините за множественный экземпляр «new Component()», но я пытаюсь использовать его везде ...

ответ

0

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

Используйте @ViewScoped или посмотрите, можете ли вы переписать код, чтобы вы могли использовать @RequestScoped.

Небольшой другой намек; при сохранении не нужно делать флеш и обновлять. Это уже происходит автоматически. Refresh также не обновляет данный объект, но возвращает новый. Поэтому просто вызов em.refresh здесь не имеет смысла.

+0

Хорошо, я меняю его на ViewScoped. И измените с ManagedBean на Named. Оно работает. Мой сценарий работает нормально. Теперь проблема другая, но я опишу ниже. – Tomek

+0

@toldi следует помнить, что область просмотра не работает в JSF 2.1 и ниже в сочетании с Named. Вероятно, вы используете область запроса. –

+0

Я нашел его вчера.
Я прочитал это, и это поможет мне выдержать:
http://germanescobar.net/2010/04/4-areas-of-possible-confusion-in-jee6.html/
Большое спасибо @MikeBraun – Tomek