2

JSF マネージド Bean を Bean という名前の CDI に変更しました。merge()ただし、EJB を介して JPA を使用してレコードを更新すると、エンティティを更新する代わりに新しいレコードが作成されるという奇妙な動作が発生します。

私の以前の実装

@ManagedBean
@ViewScoped
public class bean implements serializable{
    @EJB Service service;
    private Entity entity;

    @PostConstruct
    private void init(){
         int id = 1;
         this.entity = (Entity) service.findEntity(Entity.class, 1);

    }

    //invoke after editing entity
    public void update(){
         service.update(entity);
    }
}

@Stateless
public class Service implements Serializable{
    @PersistenceContext(unitName="unitName")
    private EntityManager em;    

    public void update(Object obj){
        em.merge(obj);
    }

    public Object find(Class klass, object pk){
        return em.find(klass, pk);
    }

}

結果: エンティティが更新されています

私の新しい実装

@Named
@ConversationScoped
public class bean implements Serializable{
    //unchanged
}

結果:エンティティは更新されず、代わりに、自動生成された整数である ID (pk) を除くすべてのフィールドが複製された新しいレコードが作成され、新しい ID が新しいレコードに対して生成されます。なぜこうなった?

4

1 に答える 1

1

本当に Bean のスコープを ConversationScoped に変更したかったのですか。私はあなたが使うだろうと思っていたでしょう

"javax.faces.view.ViewScoped"

[ javax.faces.bean.ViewScoped ではありません!! ] で、@Named を使用するだけです。Bean スコープを変更すると、セマンティクス全体が変更されました。

于 2013-11-19T04:35:02.717 に答える