2012-05-06 58 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 ++),i的值被 i是之前传递给该方法递增。但是,使用预增量(++ i)时,i会递增,然后将值传递给方法。后者显然是你想要的。

这是一个需要小心快捷方式的领域;

,如果你做了

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

,那么你就不会遇到这个问题。