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