use of org.hibernate.collection.spi.PersistentCollection in project hibernate-orm by hibernate.
the class Cascade method cascadeCollectionElements.
/**
* Cascade to the collection elements
*/
private static void cascadeCollectionElements(final CascadingAction action, final CascadePoint cascadePoint, final EventSource eventSource, final int componentPathStackDepth, final Object parent, final Object child, final CollectionType collectionType, final CascadeStyle style, final Type elemType, final Object anything, final boolean isCascadeDeleteEnabled) throws HibernateException {
final boolean reallyDoCascade = style.reallyDoCascade(action) && child != CollectionType.UNFETCHED_COLLECTION;
if (reallyDoCascade) {
final boolean traceEnabled = LOG.isTraceEnabled();
if (traceEnabled) {
LOG.tracev("Cascade {0} for collection: {1}", action, collectionType.getRole());
}
final Iterator itr = action.getCascadableChildrenIterator(eventSource, collectionType, child);
while (itr.hasNext()) {
cascadeProperty(action, cascadePoint, eventSource, componentPathStackDepth, parent, itr.next(), elemType, style, null, anything, isCascadeDeleteEnabled);
}
if (traceEnabled) {
LOG.tracev("Done cascade {0} for collection: {1}", action, collectionType.getRole());
}
}
final boolean deleteOrphans = style.hasOrphanDelete() && action.deleteOrphans() && elemType.isEntityType() && // a newly instantiated collection can't have orphans
child instanceof PersistentCollection;
if (deleteOrphans) {
final boolean traceEnabled = LOG.isTraceEnabled();
if (traceEnabled) {
LOG.tracev("Deleting orphans for collection: {0}", collectionType.getRole());
}
// we can do the cast since orphan-delete does not apply to:
// 1. newly instantiated collections
// 2. arrays (we can't track orphans for detached arrays)
final String entityName = collectionType.getAssociatedEntityName(eventSource.getFactory());
deleteOrphans(eventSource, entityName, (PersistentCollection) child);
if (traceEnabled) {
LOG.tracev("Done deleting orphans for collection: {0}", collectionType.getRole());
}
}
}
use of org.hibernate.collection.spi.PersistentCollection in project hibernate-orm by hibernate.
the class UnversionedNoCascadeDereferencedCollectionTest method testGetAndReplaceCollection.
@Test
@TestForIssue(jiraKey = "HHH-9777")
public void testGetAndReplaceCollection() {
Session s = openSession();
s.getTransaction().begin();
UnversionedNoCascadeOne one = new UnversionedNoCascadeOne();
assertNull(one.getManies());
s.save(one);
assertNull(one.getManies());
EntityEntry eeOne = getEntityEntry(s, one);
assertNull(eeOne.getLoadedValue("manies"));
s.flush();
assertNull(one.getManies());
assertNull(eeOne.getLoadedValue("manies"));
s.getTransaction().commit();
s.close();
final String role = UnversionedNoCascadeOne.class.getName() + ".manies";
s = openSession();
s.getTransaction().begin();
one = (UnversionedNoCascadeOne) s.get(UnversionedNoCascadeOne.class, one.getId());
// When returned by Session.get(), one.getManies() will return a PersistentCollection;
// the EntityEntry loaded state should contain the same PersistentCollection.
eeOne = getEntityEntry(s, one);
assertNotNull(one.getManies());
AbstractPersistentCollection maniesEEOneStateOrig = (AbstractPersistentCollection) eeOne.getLoadedValue("manies");
assertSame(one.getManies(), maniesEEOneStateOrig);
// Ensure maniesEEOneStateOrig has role, key, and session properly defined (even though one.manies == null)
assertEquals(role, maniesEEOneStateOrig.getRole());
assertEquals(one.getId(), maniesEEOneStateOrig.getKey());
assertSame(s, maniesEEOneStateOrig.getSession());
// Ensure there is a CollectionEntry for maniesEEOneStateOrig and that the role, persister, and key are set properly.
CollectionEntry ceManiesOrig = getCollectionEntry(s, maniesEEOneStateOrig);
assertNotNull(ceManiesOrig);
assertEquals(role, ceManiesOrig.getRole());
assertSame(sessionFactory().getCollectionPersister(role), ceManiesOrig.getLoadedPersister());
assertEquals(one.getId(), ceManiesOrig.getKey());
// replace collection
one.setManies(new HashSet<Many>());
s.flush();
// Ensure the same EntityEntry is being used.
assertSame(eeOne, getEntityEntry(s, one));
// Ensure CollectionEntry for maniesEEOneStateOrig is no longer in the PersistenceContext.
assertNull(getCollectionEntry(s, maniesEEOneStateOrig));
// Ensure the original CollectionEntry has role, persister, and key set to null.
assertNull(ceManiesOrig.getRole());
assertNull(ceManiesOrig.getLoadedPersister());
assertNull(ceManiesOrig.getKey());
// Ensure the PersistentCollection (that was previously returned by eeOne.getLoadedState())
// has key and role set to null.
assertNull(maniesEEOneStateOrig.getKey());
assertNull(maniesEEOneStateOrig.getRole());
// one.getManies() should be "wrapped" by a PersistentCollection now; role, key, and session should be set properly.
assertTrue(PersistentCollection.class.isInstance(one.getManies()));
assertEquals(role, ((PersistentCollection) one.getManies()).getRole());
assertEquals(one.getId(), ((PersistentCollection) one.getManies()).getKey());
assertSame(s, ((AbstractPersistentCollection) one.getManies()).getSession());
// Ensure eeOne.getLoadedState() contains the new collection.
assertSame(one.getManies(), eeOne.getLoadedValue("manies"));
// Ensure there is a new CollectionEntry for the new collection and that role, persister, and key are set properly.
CollectionEntry ceManiesAfterReplace = getCollectionEntry(s, (PersistentCollection) one.getManies());
assertNotNull(ceManiesAfterReplace);
assertEquals(role, ceManiesAfterReplace.getRole());
assertSame(sessionFactory().getCollectionPersister(role), ceManiesAfterReplace.getLoadedPersister());
assertEquals(one.getId(), ceManiesAfterReplace.getKey());
// Ensure the session in maniesEEOneStateOrig has been unset.
assertNull(maniesEEOneStateOrig.getSession());
s.getTransaction().commit();
s.close();
}
use of org.hibernate.collection.spi.PersistentCollection in project hibernate-orm by hibernate.
the class VersionedCascadeDereferencedCollectionTest method testGetAndReplaceCollection.
@Test
@TestForIssue(jiraKey = "HHH-9777")
public void testGetAndReplaceCollection() {
Session s = openSession();
s.getTransaction().begin();
VersionedCascadeOne one = new VersionedCascadeOne();
assertNull(one.getManies());
s.save(one);
assertNull(one.getManies());
EntityEntry eeOne = getEntityEntry(s, one);
assertNull(eeOne.getLoadedValue("manies"));
s.flush();
assertNull(one.getManies());
assertNull(eeOne.getLoadedValue("manies"));
s.getTransaction().commit();
s.close();
final String role = VersionedCascadeOne.class.getName() + ".manies";
s = openSession();
s.getTransaction().begin();
one = (VersionedCascadeOne) s.get(VersionedCascadeOne.class, one.getId());
// When returned by Session.get(), one.getManies() will return a PersistentCollection;
// the EntityEntry loaded state should contain the same PersistentCollection.
eeOne = getEntityEntry(s, one);
assertNotNull(one.getManies());
AbstractPersistentCollection maniesEEOneStateOrig = (AbstractPersistentCollection) eeOne.getLoadedValue("manies");
assertSame(one.getManies(), maniesEEOneStateOrig);
// Ensure maniesEEOneStateOrig has role, key, and session properly defined (even though one.manies == null)
assertEquals(role, maniesEEOneStateOrig.getRole());
assertEquals(one.getId(), maniesEEOneStateOrig.getKey());
assertSame(s, maniesEEOneStateOrig.getSession());
// Ensure there is a CollectionEntry for maniesEEOneStateOrig and that the role, persister, and key are set properly.
CollectionEntry ceManiesOrig = getCollectionEntry(s, maniesEEOneStateOrig);
assertNotNull(ceManiesOrig);
assertEquals(role, ceManiesOrig.getRole());
assertSame(sessionFactory().getCollectionPersister(role), ceManiesOrig.getLoadedPersister());
assertEquals(one.getId(), ceManiesOrig.getKey());
// replace collection
one.setManies(new HashSet<Many>());
s.flush();
// Ensure the same EntityEntry is being used.
assertSame(eeOne, getEntityEntry(s, one));
// Ensure CollectionEntry for maniesEEOneStateOrig is no longer in the PersistenceContext.
assertNull(getCollectionEntry(s, maniesEEOneStateOrig));
// Ensure the original CollectionEntry has role, persister, and key set to null.
assertNull(ceManiesOrig.getRole());
assertNull(ceManiesOrig.getLoadedPersister());
assertNull(ceManiesOrig.getKey());
// Ensure the PersistentCollection (that was previously returned by eeOne.getLoadedState())
// has key and role set to null.
assertNull(maniesEEOneStateOrig.getKey());
assertNull(maniesEEOneStateOrig.getRole());
// one.getManies() should be "wrapped" by a PersistentCollection now; role, key, and session should be set properly.
assertTrue(PersistentCollection.class.isInstance(one.getManies()));
assertEquals(role, ((PersistentCollection) one.getManies()).getRole());
assertEquals(one.getId(), ((PersistentCollection) one.getManies()).getKey());
assertSame(s, ((AbstractPersistentCollection) one.getManies()).getSession());
// Ensure eeOne.getLoadedState() contains the new collection.
assertSame(one.getManies(), eeOne.getLoadedValue("manies"));
// Ensure there is a new CollectionEntry for the new collection and that role, persister, and key are set properly.
CollectionEntry ceManiesAfterReplace = getCollectionEntry(s, (PersistentCollection) one.getManies());
assertNotNull(ceManiesAfterReplace);
assertEquals(role, ceManiesAfterReplace.getRole());
assertSame(sessionFactory().getCollectionPersister(role), ceManiesAfterReplace.getLoadedPersister());
assertEquals(one.getId(), ceManiesAfterReplace.getKey());
// Ensure the session in maniesEEOneStateOrig has been unset.
assertNull(maniesEEOneStateOrig.getSession());
s.getTransaction().commit();
s.close();
}
Aggregations