【问题标题】:How to remove stateless entity Java persistence如何移除无状态实体 Java 持久性
【发布时间】:2012-08-03 10:13:59
【问题描述】:

我有以下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;
    }
}

还有BaseServiceImplsaveremove方法:

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

我不想保存到数据库中以防ConnectSuccess失败,但是remove方法找不到实体(因为还没有进入数据库),返回ReturnCodes.REQUESTABORT后实体是保存。 如何取消保存?

【问题讨论】:

标签: java hibernate persistence stateless


【解决方案1】:

通常在这种情况下,您会执行 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);
}

过于宽泛,会阻止回滚功能。

【讨论】:

  • 所以,读了一点之后,我想要的是在方法的中间提交一个 CMT,而不是在它的末尾。这可能吗?怎么样?
  • @Alex 是的,这是可能的。你想调用 YouDao.getEntityManager().flush(); docs.oracle.com/javaee/5/api/javax/persistence/…
  • 它不适用于flush,实际上它会阻塞表数据库(我在SQL管理器中检查,查询正在运行)直到方法结束.. :(
  • @Alex 为什么首先需要在方法的中间提交?
  • 因为如果您查看我的伪代码,我的方法会初始化服务器备份,并且在将备份标记为 EXECUTING 状态后,我需要将其保存到数据库中,然后在备份作业之后继续备份作业完成,它会更新数据库中的备份信息
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多