diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java index 129b8c0f1..be4491759 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DeleteUnloadedForeignKeys.java @@ -1,93 +1,95 @@ -package com.avaje.ebeaninternal.server.persist; - -import java.util.ArrayList; -import java.util.List; - -import com.avaje.ebean.bean.EntityBean; -import com.avaje.ebeaninternal.api.SpiEbeanServer; -import com.avaje.ebeaninternal.api.SpiQuery; -import com.avaje.ebeaninternal.api.SpiTransaction; -import com.avaje.ebeaninternal.server.core.PersistRequestBean; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocOne; -import com.avaje.ebeaninternal.server.transaction.DefaultPersistenceContext; - -/** - * Used for deletion of a partially populated bean where some cascade delete - * properties where not loaded. - *

- * This bean effectively holds the foreign properties that where not loaded, and - * helps fetch the foreign keys and delete the appropriate rows. - *

- * - * @author rbygrave - */ -public class DeleteUnloadedForeignKeys { - - private final List> propList = new ArrayList>(4); - - private final SpiEbeanServer server; - - private final PersistRequestBean request; - - private EntityBean beanWithForeignKeys; - - public DeleteUnloadedForeignKeys(SpiEbeanServer server, PersistRequestBean request) { - this.server = server; - this.request = request; - } - - public boolean isEmpty() { - return propList.isEmpty(); - } - - public void add(BeanPropertyAssocOne prop) { - propList.add(prop); - } - - /** - * Execute a query fetching the missing (unloaded) foreign keys. We need to - * fetch these key values before the parent bean is deleted. - */ - public void queryForeignKeys() { - - BeanDescriptor descriptor = request.getBeanDescriptor(); - SpiQuery q = (SpiQuery) server.createQuery(descriptor.getBeanType()); - - Object id = request.getBeanId(); - - StringBuilder sb = new StringBuilder(30); - for (int i = 0; i < propList.size(); i++) { - sb.append(propList.get(i).getName()).append(","); - } - - // run query in a separate persistence context - q.setPersistenceContext(new DefaultPersistenceContext()); - q.setAutofetch(false); - q.select(sb.toString()); - q.where().idEq(id); - - SpiTransaction t = request.getTransaction(); - if (t.isLogSummary()) { - t.logSummary("-- Ebean fetching foreign key values for delete of " + descriptor.getName() + " id:" + id); - } - beanWithForeignKeys = (EntityBean)server.findUnique(q, t); - } - - /** - * Delete the rows relating to the foreign keys. These deletions occur after - * the parent bean has been deleted. - */ - public void deleteCascade() { - - for (int i = 0; i < propList.size(); i++) { - BeanPropertyAssocOne prop = propList.get(i); - Object detailBean = prop.getValue(beanWithForeignKeys); - - // if bean exists with a unique id then delete it - if (detailBean != null && prop.hasId((EntityBean)detailBean)) { - server.delete(detailBean, request.getTransaction()); - } - } - } -} +package com.avaje.ebeaninternal.server.persist; + +import java.util.ArrayList; +import java.util.List; + +import com.avaje.ebean.PersistenceContextScope; +import com.avaje.ebean.bean.EntityBean; +import com.avaje.ebeaninternal.api.SpiEbeanServer; +import com.avaje.ebeaninternal.api.SpiQuery; +import com.avaje.ebeaninternal.api.SpiTransaction; +import com.avaje.ebeaninternal.server.core.PersistRequestBean; +import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; +import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocOne; +import com.avaje.ebeaninternal.server.transaction.DefaultPersistenceContext; + +/** + * Used for deletion of a partially populated bean where some cascade delete + * properties where not loaded. + *

+ * This bean effectively holds the foreign properties that where not loaded, and + * helps fetch the foreign keys and delete the appropriate rows. + *

+ * + * @author rbygrave + */ +public class DeleteUnloadedForeignKeys { + + private final List> propList = new ArrayList>(4); + + private final SpiEbeanServer server; + + private final PersistRequestBean request; + + private EntityBean beanWithForeignKeys; + + public DeleteUnloadedForeignKeys(SpiEbeanServer server, PersistRequestBean request) { + this.server = server; + this.request = request; + } + + public boolean isEmpty() { + return propList.isEmpty(); + } + + public void add(BeanPropertyAssocOne prop) { + propList.add(prop); + } + + /** + * Execute a query fetching the missing (unloaded) foreign keys. We need to + * fetch these key values before the parent bean is deleted. + */ + public void queryForeignKeys() { + + BeanDescriptor descriptor = request.getBeanDescriptor(); + SpiQuery q = (SpiQuery) server.createQuery(descriptor.getBeanType()); + + Object id = request.getBeanId(); + + StringBuilder sb = new StringBuilder(30); + for (int i = 0; i < propList.size(); i++) { + sb.append(propList.get(i).getName()).append(","); + } + + // run query in a separate persistence context + q.setPersistenceContext(new DefaultPersistenceContext()); + q.setPersistenceContextScope(PersistenceContextScope.QUERY); + q.setAutofetch(false); + q.select(sb.toString()); + q.where().idEq(id); + + SpiTransaction t = request.getTransaction(); + if (t.isLogSummary()) { + t.logSummary("-- Ebean fetching foreign key values for delete of " + descriptor.getName() + " id:" + id); + } + beanWithForeignKeys = (EntityBean)server.findUnique(q, t); + } + + /** + * Delete the rows relating to the foreign keys. These deletions occur after + * the parent bean has been deleted. + */ + public void deleteCascade() { + + for (int i = 0; i < propList.size(); i++) { + BeanPropertyAssocOne prop = propList.get(i); + Object detailBean = prop.getValue(beanWithForeignKeys); + + // if bean exists with a unique id then delete it + if (detailBean != null && prop.hasId((EntityBean)detailBean)) { + server.delete(detailBean, request.getTransaction()); + } + } + } +}