add Session.getReference(Object)
like in Hibernate Reactive this is really useful for dealing with detached instances + associations
This commit is contained in:
parent
0dc94d312e
commit
65ce96b776
|
@ -781,6 +781,18 @@ public interface Session extends SharedSessionContract, EntityManager {
|
||||||
*/
|
*/
|
||||||
String getEntityName(Object object);
|
String getEntityName(Object object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the persistent instance with the same identity as the given instance, which
|
||||||
|
* might be detached, assuming that the instance is still persistent in the database.
|
||||||
|
* This method never results in access to the underlying data store, and thus might
|
||||||
|
* return a proxy that must be initialized explicitly.
|
||||||
|
*
|
||||||
|
* @param object a detached persistent instance
|
||||||
|
*
|
||||||
|
* @return the persistent instance or proxy
|
||||||
|
*/
|
||||||
|
<T> T getReference(T object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an {@link IdentifierLoadAccess} instance to retrieve the specified entity type by
|
* Create an {@link IdentifierLoadAccess} instance to retrieve the specified entity type by
|
||||||
* primary key.
|
* primary key.
|
||||||
|
|
|
@ -900,6 +900,11 @@ public class SessionDelegatorBaseImpl implements SessionImplementor {
|
||||||
return delegate.getEntityName( object );
|
return delegate.getEntityName( object );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getReference(T object) {
|
||||||
|
return delegate.getReference( object );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> IdentifierLoadAccess<T> byId(String entityName) {
|
public <T> IdentifierLoadAccess<T> byId(String entityName) {
|
||||||
return delegate.byId( entityName );
|
return delegate.byId( entityName );
|
||||||
|
|
|
@ -1703,6 +1703,19 @@ public class SessionImpl
|
||||||
return entry.getPersister().getEntityName();
|
return entry.getPersister().getEntityName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override @SuppressWarnings("unchecked")
|
||||||
|
public <T> T getReference(T object) {
|
||||||
|
checkOpen();
|
||||||
|
if ( object instanceof HibernateProxy ) {
|
||||||
|
LazyInitializer initializer = ( (HibernateProxy) object ).getHibernateLazyInitializer();
|
||||||
|
return (T) getReference( initializer.getPersistentClass(), initializer.getIdentifier() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
EntityPersister persister = getEntityPersister( null, object );
|
||||||
|
return (T) getReference( persister.getMappedClass(), persister.getIdentifier(object, this) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void throwTransientObjectException(Object object) throws HibernateException {
|
private void throwTransientObjectException(Object object) throws HibernateException {
|
||||||
throw new TransientObjectException(
|
throw new TransientObjectException(
|
||||||
"object references an unsaved transient instance - save the transient instance before flushing: " +
|
"object references an unsaved transient instance - save the transient instance before flushing: " +
|
||||||
|
|
Loading…
Reference in New Issue