Jsf CDI一直在创建新记录,而不是更新
我已将JSF管理bean更改为名为bean的CDI。然而,当我通过EJB使用JPAJsf 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
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版本。