Hibernate insert zamiast update

0

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;
    }
0

sprawdz czy w emp jest id ustawione

0
Szczery napisał(a):

sprawdz czy w emp jest id ustawione

Sprawdziłem i faktycznie jest coś dziwnego bo gdy robie sobie instancie pracownika na podstawie hash to jest ustawione, ale pozniej z formularza gdy przekazuje to juz jest null'em. Czy musze ustawić jakiś hidden z wartością tego idika? Czy to jest tak, że gdy nie będę miał jakiejś wartości w formularzu to wtedy ona zostanie znullowana?

1 użytkowników online, w tym zalogowanych: 0, gości: 1