@SuppressWarnings("unchecked")
  public PersistRequestBean(
      SpiEbeanServer server,
      T bean,
      Object parentBean,
      BeanManager<T> mgr,
      SpiTransaction t,
      PersistExecute persistExecute) {

    super(server, t, persistExecute);
    this.beanManager = mgr;
    this.beanDescriptor = mgr.getBeanDescriptor();
    this.beanPersistListener = beanDescriptor.getPersistListener();
    this.bean = bean;
    this.parentBean = parentBean;

    this.controller = beanDescriptor.getPersistController();
    this.concurrencyMode = beanDescriptor.getConcurrencyMode();

    if (bean instanceof EntityBean) {
      this.intercept = ((EntityBean) bean)._ebean_getIntercept();
      if (intercept.isReference()) {
        // allowed to delete reference objects
        // with no concurrency checking
        this.concurrencyMode = ConcurrencyMode.NONE;
      }
      // this is ok to not use isNewOrDirty() as used for updates only
      this.isDirty = intercept.isDirty();
      if (!isDirty) {
        this.changedProps = intercept.getChangedProps();
      } else {
        // merge changed properties on the bean with changed embedded beans
        Set<String> beanChangedProps = intercept.getChangedProps();
        Set<String> dirtyEmbedded = beanDescriptor.getDirtyEmbeddedProperties(bean);
        this.changedProps = mergeChangedProperties(beanChangedProps, dirtyEmbedded);
      }
      this.loadedProps = intercept.getLoadedProps();
      this.oldValues = (T) intercept.getOldValues();
      this.vanilla = false;

    } else {
      // have to assume the vanilla bean is dirty
      this.vanilla = true;
      this.isDirty = true;
      this.loadedProps = null;
      this.changedProps = null;
      this.intercept = null;

      // degrade concurrency checking to none for vanilla bean
      if (concurrencyMode.equals(ConcurrencyMode.ALL)) {
        this.concurrencyMode = ConcurrencyMode.NONE;
      }
    }
  }
 /**
  * Determine the concurrency mode depending on fully/partially populated bean.
  *
  * <p>Specifically with version concurrency we want to check that the version property was one of
  * the loaded properties.
  */
 public ConcurrencyMode determineConcurrencyMode() {
   if (loadedProps != null) {
     // 'partial bean' update/delete...
     if (concurrencyMode.equals(ConcurrencyMode.VERSION)) {
       // check the version property was loaded
       BeanProperty prop = beanDescriptor.firstVersionProperty();
       if (prop != null && loadedProps.contains(prop.getName())) {
         // OK to use version property
       } else {
         concurrencyMode = ConcurrencyMode.NONE;
       }
     }
   }
   return concurrencyMode;
 }