public void Delete(object id, object version, object obj, ISessionImplementor session) { int span = TableSpan; bool isImpliedOptimisticLocking = !entityMetamodel.IsVersioned && entityMetamodel.OptimisticLockMode > OptimisticLockMode.Version; object[] loadedState = null; if (isImpliedOptimisticLocking) { // need to treat this as if it where optimistic-lock="all" (dirty does *not* make sense); // first we need to locate the "loaded" state // // Note, it potentially could be a proxy, so perform the location the safe way... EntityKey key = new EntityKey(id, this); object entity = session.GetEntity(key); if (entity != null) { EntityEntry entry = session.GetEntry(entity); loadedState = entry.LoadedState; } } SqlCommandInfo[] deleteStrings; if (isImpliedOptimisticLocking && loadedState != null) { // we need to utilize dynamic delete statements deleteStrings = GenerateDeleteStrings(loadedState); } else { // otherwise, utilize the static delete statements deleteStrings = SqlDeleteStrings; } for (int j = span - 1; j >= 0; j--) { Delete(id, version, j, obj, deleteStrings[j], session, loadedState); } }
/// <summary> /// Get the key value from the owning entity instance, usually the identifier, but might be some /// other unique key, in the case of property-ref /// </summary> public object GetKeyOfOwner(object owner, ISessionImplementor session) { EntityEntry entityEntry = session.GetEntry(owner); if (entityEntry == null) { // This just handles a particular case of component // projection, perhaps get rid of it and throw an exception return null; } if (foreignKeyPropertyName == null) { return entityEntry.Id; } else { // TODO: at the point where we are resolving collection references, we don't // know if the uk value has been resolved (depends if it was earlier or // later in the mapping document) - now, we could try and use e.getStatus() // to decide to semiResolve(), trouble is that initializeEntity() reuses // the same array for resolved and hydrated values object id = entityEntry.GetLoadedValue(foreignKeyPropertyName); // NOTE VERY HACKISH WORKAROUND!! IType keyType = GetPersister(session).KeyType; if (!keyType.ReturnedClass.IsInstanceOfType(id)) { id = keyType.SemiResolve( entityEntry.GetLoadedValue(foreignKeyPropertyName), session, owner ); } return id; } }