private boolean isConnectedToSession() {
if (session == null) {
ApplicationContext context = StaticBeanRegistry.getInstance().getApplicationContext();
if (context != null) {
SessionFactory sf = context.getBean(SessionFactory.class);
session = (SessionImplementor) sf.getCurrentSession();
if (session == null) {
session = (SessionImplementor) sf.openSession();
}
LOGGER.warn("Patch: Detached object had no session, obtained one from the Session Factory");
if (!session.getPersistenceContext().containsCollection(this)) {
CollectionPersister persister = session.getFactory().getCollectionPersister(role);
if (owner != null && session.getPersistenceContext().getEntry(owner) == null) {
/*
* Also attach owner, else the collection will be marked as dereferenced (orphaned) which will delete the collection!
*/
EntityPersister ownerPersister = persister.getOwnerEntityPersister();
Serializable ownerId = ownerPersister.getIdentifier(owner, session);
Object version = ownerPersister.getVersion(owner);
Object[] loadedState = ownerPersister.getPropertyValues(owner);
Status status = ownerPersister.isMutable() ? Status.MANAGED : Status.READ_ONLY;
session.getPersistenceContext().addEntry(owner, status, loadedState, null, ownerId, version, LockMode.NONE, true, ownerPersister,
ownerPersister.isVersioned(), true);
}
if (key != null) {
session.getPersistenceContext().addUninitializedCollection(persister, this, key);
session.initializeCollection(this, false);
} else {
session.getPersistenceContext().addUninitializedDetachedCollection(persister, this);
}
}
}
}
return session != null &&
session.isOpen() &&
session.getPersistenceContext().containsCollection( this );
}