hi,all
i need a demand that when hibernate flush changes to database ,i need some entity's collection don't be flushed。such as this a Execution with some variables,when Execution has been removed ,i need Hibernate don't modify the variables'S parent,don't set them parent is null.it get so many sql。。。。I don't love it :(。。。。so i want change this。。。i modify it like this:
create a new FlushEventListener ,copy the AbstractFlushingEventListener and DefaultAutoFlushEventListener in the it。add decision in the method of
Quote:
flushCollections(EventSource session)
,modify like this:
Code:
private void flushCollections(EventSource session)
throws HibernateException {
log.trace("Processing unreferenced collections");
List list = IdentityMap.entries(session.getPersistenceContext()
.getCollectionEntries());
int size = list.size();
for (int i = 0; i < size; i++) {
Map.Entry me = (Map.Entry) list.get(i);
CollectionEntry ce = (CollectionEntry) me.getValue();
if (!ce.isReached() && !ce.isIgnore()) {
Collections.processUnreachableCollection(
(PersistentCollection) me.getKey(), session);
}
}
// Schedule updates to collections:
log.trace("Scheduling collection removes/(re)creates/updates");
list = IdentityMap.entries(session.getPersistenceContext()
.getCollectionEntries());
size = list.size();
ActionQueue actionQueue = session.getActionQueue();
for (int i = 0; i < size; i++) {
Map.Entry me = (Map.Entry) list.get(i);
PersistentCollection coll = (PersistentCollection) me.getKey();
CollectionEntry ce = (CollectionEntry) me.getValue();
[i][color=#FF0000]if (ce.getRole() != null && ce.getRole().indexOf("personal.shuaia") != -1){
continue; //modify here。don't generate the cats's change-sql
}[/color][/i]
if (ce.isDorecreate()) {
session.getInterceptor().onCollectionRecreate(coll,
ce.getCurrentKey());
actionQueue.addAction(new CollectionRecreateAction(coll, ce
.getCurrentPersister(), ce.getCurrentKey(), session));
}
if (ce.isDoremove()) {
session.getInterceptor().onCollectionRemove(coll,
ce.getLoadedKey());
actionQueue.addAction(new CollectionRemoveAction(coll, ce
.getLoadedPersister(), ce.getLoadedKey(), ce
.isSnapshotEmpty(coll), session));
}
if (ce.isDoupdate()) {
session.getInterceptor().onCollectionUpdate(coll,
ce.getLoadedKey());
actionQueue.addAction(new CollectionUpdateAction(coll, ce
.getLoadedPersister(), ce.getLoadedKey(), ce
.isSnapshotEmpty(coll), session));
}
}
actionQueue.sortCollectionActions();
}
BUT,I GET EXCEPTION whit this modify!!!!:(:(:(:(:(