Jsf CDI一直在创建新记录,而不是更新

Jsf CDI一直在创建新记录,而不是更新,jsf,cdi,Jsf,Cdi,我已将JSF管理bean更改为名为bean的CDI。然而,当我通过EJB使用JPAmerge()更新记录时,会出现一个奇怪的行为,即创建一个新记录,而不是更新实体 我以前的实施 @ManagedBean @ViewScoped public class bean implements serializable{ @EJB Service service; private Entity entity; @PostConstruct private void ini

我已将JSF管理bean更改为名为bean的CDI。然而,当我通过EJB使用JPA
merge()
更新记录时,会出现一个奇怪的行为,即创建一个新记录,而不是更新实体

我以前的实施

@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
}
结果:正在更新实体

我的新实现

@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;为什么会这样

您真的想将bean的范围更改为ConversationScope吗。我本以为你会用

"javax.faces.view.ViewScoped"

[不是javax.faces.bean.ViewScoped!!]只需使用@Named即可。更改bean作用域改变了整个语义。

是否将调用getReference()时得到的相同对象传递给update()(或者通过实体管理器加载对象的方式)?@AdrianMitev是的,它是具有相同id(pk)的相同对象。。但是,当将新对象传递给jpa时,会创建另一行,其中除id之外的所有字段都被复制(因为它是自动生成的整数)。您在什么时候创建对话?@BalusC在这个问题中有Java语言。请注意,这个注释是在相对较新的JSF 2.2中引入的,OP没有提到他正在使用的JSF版本。