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をクリックします。それは実行します:

public String createView()

  1. そこにいくつかのデータを追加し、いくつかのファイルをアップロードします...
  2. 次に、保存して閉じるボタンをクリックします。それは実行します:

public String createAndClose()

  1. 正常にデータをデータベースに保存しました。

そして、これをもう一度実行すると、以前に保存したデータが表示されるという問題があります。デバッグしましたが、どこに設定されているのかわかりません。後

public String createView()

jsf ページには new Component() を使用する必要があります。では、どこで私は間違いを犯しますか?私はまだ理解していませんか?プレーンJPAの代わりにHibernateを使用する必要がありますか?以前は(Hibernate)使用していたので、(HibernateUtil を使用すると)簡単になりました。

PS。「new Component()」の複数のインスタンスで申し訳ありませんが、どこにでも配置しようとしています...

4

1 に答える 1

0

最大の欠点は、セッション スコープを使用しているにもかかわらず、単一のビューを明確に意図したインスタンス変数があることです。

@ViewScoped を使用するか、@RequestScoped を使用できるようにコードを書き直すことができるかどうかを確認してください。

その他の小さなヒント。保存するときは、フラッシュとリフレッシュを行う必要はありません。これはすでに自動的に行われています。Refresh も指定されたエンティティを更新しませんが、新しいものを返します。したがって、ここでは em.refresh を呼び出すだけでは意味がありません。

于 2013-08-19T08:33:04.357 に答える