Hej,
mam problem ze zrobieniem updatea na rekordzie w tabeli, zamiast tego robi mi sie insert.
Wszystko jest w oparciu o jsf i hibernate, natomiast robie jedna niestandardowa rzecz, mianowicie kluczami podstawowymi sa Long ale do formularza edycji przekazuje w gecie 6 znakowy string Hash.
Kod mniej wiecej wyglada tak:
Dao:
@PersistenceContext
EntityManager em;
public List<Employee> byField(Map<String, Object> params) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> query = cb.createQuery(Employee.class);
Root<Employee> root = query.from(Employee.class);
List<Predicate> criteriaList = new ArrayList<Predicate>();
for (Map.Entry<String, Object> entry : params.entrySet()) {
Predicate p = cb.equal(root.get(entry.getKey()), entry.getValue());
criteriaList.add(p);
}
query.where(cb.and(criteriaList.toArray(new Predicate[] {})));
return em.createQuery(query).getResultList();
}
@Transactional
public void save(Employee obj) throws MyException{
try {
em.persist(obj);
} catch (Exception e) {
throw new InweoException(e);
}
}
@Transactional
public void update(Employee obj) throws MyException {
try {
em.merge(obj);
} catch (Exception e) {
throw new MyException(e);
}
}
xhtml (w skrócie)
<f:metadata>
<f:viewParam name="hash" value="#{empCtrl.emp.hash}" />
<f:viewAction action="#{empCtrl.load}" />
</f:metadata>
<h:form enctype="multipart/form-data">
<h:inputText value="#{empCtrl.emp.name}" />
<h:commandButton value="Zapisz" action="#{empCtrl.edit}" />
</h:form>
Bean
private Employee emp = new Employee();
//getters setters
public String edit() {
try {
dao.update(emp);
} catch (MyException e) {
addMessage("Wystapił bład podczas zapisu. Spróbuj ponownie później");
return null;
}
addMessage("Dane zostały zaktualizowane");
return "/";
}
public String load() {
Map<String, Object> params = new HashMap<String, Object>();
params.put("hash", emp.getHash());
List<Employee> list = dao.byField(params);
emp = list.get(0);
return null;
}