2012-05-06 3 views
0

У меня есть метод в части ejb, который должен увеличивать простое целочисленное значение объекта и сохранять изменения в db. Я не могу заставить его работать, поскольку он печатает всегда одно и то же значение!Редактирование объекта EJB

Вот код:

public void incrementDownloads(Dispensa dispensa) { 
    int dl = dispensa.getDownloads(); 
    System.out.println(dispensa.getTitolo() + " had " + dl + " downloads"); 
    dispensa.setDownloads(dl++); 
    dispensaFacade.edit(dispensa);   
    dispensa = dispensaFacade.refresh(dispensa); 
    System.out.println("now it has " + dispensa.getNumDownloads()); 
} 

где dispensaFacade используемые методы являются одним из сгенерированного AbstractFacade:

public void edit(T entity) { 
    getEntityManager().merge(entity); 
} 

public T refresh(T entity){ 
    T res = getEntityManager().merge(entity); 
    getEntityManager().refresh(res); 
    return res; 
} 

Мой код выводит:

Название 1 было 0 загрузок

теперь имеет 0

который явно не прав!

Где ошибка?

ответ

1

При использовании в одиночку, т.е.

++i; 
// or 
i++; 

операторы до/после приращения функционально эквивалентны. Однако в вашем случае вы используете их как параметр метода, и разница становится очевидной.

Вот какой код, который, я надеюсь, проиллюстрирует проблему.

public static void main(String[] args) { 
    int i = 0; 
    printPassedValue(i++); 
    System.out.println("i = " + i); 
    printPassedValue(++i); 
    System.out.println("i = " + i); 
} 


private static void printPassedValue(int value) { 
    System.out.println("Passed value: " + value); 
} 

при выполнении этого кода производит

Passed value: 0 
i = 1 
Passed value: 2 
i = 2 

Как вы можете видеть, при использовании пост-инкремент таким образом (т.е. я ++), значение I передается методу перед тем я есть увеличивается. Однако при использовании pre-increment (++ i) i увеличивается, а затем значение передается методу. Последнее очевидно, что вы хотите.

Это одна из областей, где нужно быть осторожным, используя ярлыки;

если вы сделали

dl++; // or ++dl; 
dispensa.setDownloads(dl); 

, то вы бы не столкнулись с этой проблемой.

Смежные вопросы