mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
#1063 - Add Event Listeners capable of being notified for delete by id
Adds BeanDeleteIdRequest and adds a method to BeanPersistController and BeanPersistAdapter
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
package io.ebean.event;
|
||||
|
||||
import io.ebean.EbeanServer;
|
||||
import io.ebean.Transaction;
|
||||
|
||||
/**
|
||||
* A request to delete a bean by Id value.
|
||||
*/
|
||||
public interface BeanDeleteIdRequest {
|
||||
|
||||
/**
|
||||
* Return the server processing the request.
|
||||
*/
|
||||
EbeanServer getEbeanServer();
|
||||
|
||||
/**
|
||||
* Return the Transaction associated with this request.
|
||||
*/
|
||||
Transaction getTransaction();
|
||||
|
||||
/**
|
||||
* Returns the Id value of the bean being deleted.
|
||||
*/
|
||||
Object getId();
|
||||
|
||||
}
|
||||
@@ -87,4 +87,11 @@ public abstract class BeanPersistAdapter implements BeanPersistController {
|
||||
public void postSoftDelete(BeanPersistRequest<?> request) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Does nothing by default.
|
||||
*/
|
||||
@Override
|
||||
public void preDelete(BeanDeleteIdRequest request) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,6 +92,11 @@ public interface BeanPersistController {
|
||||
*/
|
||||
boolean preSoftDelete(BeanPersistRequest<?> request);
|
||||
|
||||
/**
|
||||
* Prior to a delete by id perform some action.
|
||||
*/
|
||||
void preDelete(BeanDeleteIdRequest request);
|
||||
|
||||
/**
|
||||
* Called after the insert was performed.
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.ebeaninternal.server.deploy;
|
||||
|
||||
import io.ebean.event.BeanDeleteIdRequest;
|
||||
import io.ebean.event.BeanPersistController;
|
||||
import io.ebean.event.BeanPersistRequest;
|
||||
|
||||
@@ -147,6 +148,13 @@ public class ChainedBeanPersistController implements BeanPersistController {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preDelete(BeanDeleteIdRequest request) {
|
||||
for (BeanPersistController aChain : chain) {
|
||||
aChain.preDelete(request);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean preInsert(BeanPersistRequest<?> request) {
|
||||
for (BeanPersistController aChain : chain) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import io.ebean.bean.BeanCollection;
|
||||
import io.ebean.bean.BeanCollection.ModifyListenMode;
|
||||
import io.ebean.bean.EntityBean;
|
||||
import io.ebean.bean.PersistenceContext;
|
||||
import io.ebean.event.BeanPersistController;
|
||||
import io.ebeaninternal.api.SpiEbeanServer;
|
||||
import io.ebeaninternal.api.SpiTransaction;
|
||||
import io.ebeaninternal.api.SpiUpdate;
|
||||
@@ -718,6 +719,7 @@ public final class DefaultPersister implements Persister {
|
||||
}
|
||||
|
||||
// use Id's to update L2 cache rather than Bulk table event
|
||||
notifyDeleteById(descriptor, id, idList, transaction);
|
||||
deleteById.setAutoTableMod(false);
|
||||
if (idList != null) {
|
||||
t.getEvent().addDeleteByIdList(descriptor, idList);
|
||||
@@ -738,6 +740,22 @@ public final class DefaultPersister implements Persister {
|
||||
return rows;
|
||||
}
|
||||
|
||||
private void notifyDeleteById(BeanDescriptor<?> descriptor, Object id, List<Object> idList, Transaction transaction) {
|
||||
|
||||
BeanPersistController controller = descriptor.getPersistController();
|
||||
if (controller != null) {
|
||||
DeleteIdRequest request = new DeleteIdRequest(server, transaction, id);
|
||||
if (idList == null) {
|
||||
controller.preDelete(request);
|
||||
} else {
|
||||
for (Object idValue : idList) {
|
||||
request.setId(idValue);
|
||||
controller.preDelete(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We need to create and execute a query to get the foreign key values as
|
||||
* the delete cascades to them (foreign keys).
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package io.ebeaninternal.server.persist;
|
||||
|
||||
import io.ebean.EbeanServer;
|
||||
import io.ebean.Transaction;
|
||||
import io.ebean.event.BeanDeleteIdRequest;
|
||||
import io.ebeaninternal.api.SpiEbeanServer;
|
||||
|
||||
class DeleteIdRequest implements BeanDeleteIdRequest {
|
||||
|
||||
private final EbeanServer server;
|
||||
private final Transaction transaction;
|
||||
private Object id;
|
||||
|
||||
DeleteIdRequest(SpiEbeanServer server, Transaction transaction, Object id) {
|
||||
this.server = server;
|
||||
this.transaction = transaction;
|
||||
}
|
||||
|
||||
void setId(Object id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EbeanServer getEbeanServer() {
|
||||
return server;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Transaction getTransaction() {
|
||||
return transaction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user