1

我需要你的帮助

  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. 我有一个像这样的通用 dao 服务

    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. 因此,当我首先运行应用程序时,我单击一些链接Add component。它执行:

公共字符串 createView()

  1. 我在那里添加一些数据+上传一些文件等......
  2. 然后我点击保存并关闭按钮。它执行:

公共字符串 createAndClose()

  1. 成功地将我的数据保存到数据库。

这是一个问题,当我再次执行此操作时,它会显示我之前保存的数据。我调试它,但我不明白它的设置位置。后

公共字符串 createView()

它应该为 jsf 页面使用新的 Component()。那么我在哪里犯了错误?什么我还是不明白?也许我应该使用 Hibernate 而不是普通的 JPA?我以前使用它(Hibernate),所以它更容易(使用 HibernateUtil)。

PS。对不起“new Component()”的多个实例,但我正在尝试将它放在任何地方......

4

1 回答 1

0

最大的缺陷是您使用的是会话范围,但具有明显用于单个视图的实例变量。

使用@ViewScoped 或查看是否可以重写代码以便可以使用@RequestScoped。

一个小的其他提示;保存时不需要进行刷新和刷新。这已经自动发生了。Refresh 也不会更新给定的实体,而是返回一个新的实体。因此在这里调用 em.refresh 是没有意义的。

于 2013-08-19T08:33:04.357 回答