1

Java永続性に関して次のような状況があります。

public ReturnCodes startWork() {

    sessionBackup = (BaseService<Backup>) ctx.lookup("XYZ/BackupServiceImpl/local");

    Backup backup = new Backup();
    backup.setStatus(BackupStatus.EXECUTING);
    ....
    sessionBackup.save(Backup) //at this point is not actualy saved into DB

    ....//try to connect somewhere
    if ( !ConnectSuccess) {
        sessionBackup.remove(backup);
        return ReturnCodes.REQUESTABORT
    }
    ....
}

@Stateless
public class BackupServiceImpl extends BaseServiceImpl<Backup> implements
    BaseService<Backup>
{

    @Override
    protected Class<Backup> getEntityClass()
    {
        return Backup.class;
    }
}

saveremoveメソッドBaseServiceImpl:

public abstract class BaseServiceImpl<T extends Serializable> implements
    BaseService<T>
{

  protected EntityManagerFactory emf;

  public T save(T entity)
  {
    EntityManager em = emf.createEntityManager();
    em.persist(entity);

    return entity;
  }

  public void remove(T entity)
  {
    EntityManager em = emf.createEntityManager();
    try
    {
      final Method method = getEntityClass().getMethod("getId");
      final String id = (String) ((T) method.invoke(entity));
      entity = em.find(getEntityClass(), id);
      em.remove(entity);
    }
    catch (final Exception ex)
    {
      logger.log(Level.WARNING, "Unexpected error", ex);
    }
  }
}

失敗した場合に備えてDBに保存したくありませんConnectSuccessが、removeメソッドはエンティティを見つけることができず(まだDBにないため)、返された後ReturnCodes.REQUESTABORTにエンティティが保存されます。保存をキャンセルするにはどうすればよいですか?

4

1 に答える 1

0

一般に、この場合は setRollbackOnly() を実行します。

ロールバックのみをトリガーする例外をスローすることもできます。

http://www.developerscrappad.com/547/java/java-ee/ejb3-x-jpa-when-to-use-rollback-and-setrollbackonly/を参照してください。

ちなみに、コードでこれを行うと:

catch (final Exception ex)
{
  logger.log(Level.WARNING, "Unexpected error", ex);
}

範囲が広すぎるため、ロールバック機能がブロックされます。

于 2012-08-03T13:19:01.650 に答える