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 が新しいレコードに対して生成されます。なぜこうなった?