【发布时间】:2010-03-11 23:27:56
【问题描述】:
我有以下生成顺序卡号的类。 我试图通过递归调用相同的方法从 OptimisticLockException 中恢复。但是,我得到了 TransactionRequiredException。在我的情况下,有谁知道如何从 OptimisticLockException 中恢复?
提前非常感谢
@Name("simpleAutoIncrementGenerator")
public class SimpleAutoIncrementGenerator extends CardNumberGenerator{
private static final long serialVersionUID = 2869548248468809665L;
private int numberOfRetries = 0;
@Override
public String generateNextNumber(CardInstance cardInstance, EntityManager entityManager) {
try{
EntityCard card = (EntityCard)entityManager.find(EntityCard.class, cardInstance.getId());
if(card != null){
String nextNumber = "";
String currentNumber = card.getCurrentCardNumber();
if(currentNumber != null && !currentNumber.isEmpty()){
Long numberToInc = Long.parseLong(currentNumber);
numberToInc ++;
nextNumber = String.valueOf(numberToInc);
card.setCurrentCardNumber(nextNumber);
// this is just to cause a OptimisticLock Exception
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
entityManager.persist(card);
entityManager.flush();
return nextNumber;
}
}
}catch (OptimisticLockException oLE) {
System.out.println("\n\n\n\n OptimisticLockException \n\n\n\n");
if(numberOfRetries < CentralizedConfig.CARD_NUMBER_GENERATOR_MAX_TRIES){
numberOfRetries ++;
return generateNextNumber(cardInstance,entityManager);
}
}catch (TransactionRequiredException trE) {
System.out.println("\n\n\n\n TransactionRequiredException \n\n\n\n");
if(numberOfRetries < CentralizedConfig.CARD_NUMBER_GENERATOR_MAX_TRIES){
numberOfRetries ++;
return generateNextNumber(cardInstance,entityManager);
}
}catch (StaleObjectStateException e) {
System.out.println("\n\n\n\n StaleObjectStateException \n\n\n\n");
if(numberOfRetries < CentralizedConfig.CARD_NUMBER_GENERATOR_MAX_TRIES){
numberOfRetries ++;
return generateNextNumber(cardInstance,entityManager);
}
}
return null;
}
}
【问题讨论】:
标签: java hibernate orm jpa seam