Copilot commented on code in PR #15354: URL: https://github.com/apache/grails-core/pull/15354#discussion_r2729679403
########## grails-data-hibernate5/core/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java: ########## @@ -0,0 +1,851 @@ +/* + * Copyright 2002-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.grails.orm.hibernate.support.hibernate5; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.hibernate.Filter; +import org.hibernate.LockMode; +import org.hibernate.ReplicationMode; +import org.hibernate.criterion.DetachedCriteria; + +import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; + +/** + * Interface that specifies a common set of Hibernate operations as well as + * a general {@link #execute} method for Session-based lambda expressions. + * Implemented by {@link HibernateTemplate}. Not often used, but a useful option + * to enhance testability, as it can easily be mocked or stubbed. + * + * <p>Defines {@code HibernateTemplate}'s data access methods that mirror various + * {@link org.hibernate.Session} methods. Users are strongly encouraged to read the + * Hibernate {@code Session} javadocs for details on the semantics of those methods. + * + * <p><b>A deprecation note:</b> While {@link HibernateTemplate} and this operations + * interface are being kept around for backwards compatibility in terms of the data + * access implementation style in Spring applications, we strongly recommend the use + * of native {@link org.hibernate.Session} access code for non-trivial interactions. + * This in particular affects parameterized queries where - on Java 8+ - a custom + * {@link HibernateCallback} lambda code block with {@code createQuery} and several + * {@code setParameter} calls on the {@link org.hibernate.query.Query} interface + * is an elegant solution, to be executed via the general {@link #execute} method. + * All such operations which benefit from a lambda variant have been marked as + * {@code deprecated} on this interface. + * + * <p><b>A Hibernate compatibility note:</b> {@link HibernateTemplate} and the + * operations on this interface generally aim to be applicable across all Hibernate + * versions. In terms of binary compatibility, Spring ships a variant for each major + * generation of Hibernate (in the present case: Hibernate ORM 5.x). However, due to + * refactorings and removals in Hibernate ORM 5.3, some variants - in particular + * legacy positional parameters starting from index 0 - do not work anymore. + * All affected operations are marked as deprecated; please replace them with the + * general {@link #execute} method and custom lambda blocks creating the queries, + * ideally setting named parameters through {@link org.hibernate.query.Query}. + * <b>Please be aware that deprecated operations are known to work with Hibernate + * ORM 5.2 but may not work with Hibernate ORM 5.3 and higher anymore.</b> + * + * @author Juergen Hoeller + * @since 4.2 + * @see HibernateTemplate + * @see org.hibernate.Session + * @see HibernateTransactionManager + */ +public interface HibernateOperations { + + /** + * Execute the action specified by the given action object within a + * {@link org.hibernate.Session}. + * <p>Application exceptions thrown by the action object get propagated + * to the caller (can only be unchecked). Hibernate exceptions are + * transformed into appropriate DAO ones. Allows for returning a result + * object, that is a domain object or a collection of domain objects. + * <p>Note: Callback code is not supposed to handle transactions itself! + * Use an appropriate transaction manager like + * {@link HibernateTransactionManager}. Generally, callback code must not + * touch any {@code Session} lifecycle methods, like close, + * disconnect, or reconnect, to let the template do its work. + * @param action callback object that specifies the Hibernate action + * @return a result object returned by the action, or {@code null} + * @throws DataAccessException in case of Hibernate errors + * @see HibernateTransactionManager + * @see org.hibernate.Session + */ + @Nullable + <T> T execute(HibernateCallback<T> action) throws DataAccessException; + + //------------------------------------------------------------------------- + // Convenience methods for loading individual objects + //------------------------------------------------------------------------- + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + Object get(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + Object get(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + Object load(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + Object load(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return all persistent instances of the given entity class. + * Note: Use queries or criteria for retrieving a specific subset. + * @param entityClass a persistent class + * @return a {@link List} containing 0 or more persistent instances + * @throws DataAccessException if there is a Hibernate error + * @see org.hibernate.Session#createCriteria + */ + <T> List<T> loadAll(Class<T> entityClass) throws DataAccessException; + + /** + * Load the persistent instance with the given identifier + * into the given object, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Object, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entity the object (of the target class) to load into + * @param id the identifier of the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Object, Serializable) + */ + void load(Object entity, Serializable id) throws DataAccessException; + + /** + * Re-read the state of the given persistent instance. + * @param entity the persistent instance to re-read + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#refresh(Object) + */ + void refresh(Object entity) throws DataAccessException; + + /** + * Re-read the state of the given persistent instance. + * Obtains the specified lock mode for the instance. + * @param entity the persistent instance to re-read + * @param lockMode the lock mode to obtain + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#refresh(Object, LockMode) + */ + void refresh(Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Check whether the given object is in the Session cache. + * @param entity the persistence instance to check + * @return whether the given object is in the Session cache + * @throws DataAccessException if there is a Hibernate error + * @see org.hibernate.Session#contains + */ + boolean contains(Object entity) throws DataAccessException; + + /** + * Remove the given object from the {@link org.hibernate.Session} cache. + * @param entity the persistent instance to evict + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#evict + */ + void evict(Object entity) throws DataAccessException; + + /** + * Force initialization of a Hibernate proxy or persistent collection. + * @param proxy a proxy for a persistent object or a persistent collection + * @throws DataAccessException if we can't initialize the proxy, for example + * because it is not associated with an active Session + * @see org.hibernate.Hibernate#initialize + */ + void initialize(Object proxy) throws DataAccessException; + + /** + * Return an enabled Hibernate {@link Filter} for the given filter name. + * The returned {@code Filter} instance can be used to set filter parameters. + * @param filterName the name of the filter + * @return the enabled Hibernate {@code Filter} (either already + * enabled or enabled on the fly by this operation) + * @throws IllegalStateException if we are not running within a + * transactional Session (in which case this operation does not make sense) + */ + Filter enableFilter(String filterName) throws IllegalStateException; + + //------------------------------------------------------------------------- + // Convenience methods for storing individual objects + //------------------------------------------------------------------------- + + /** + * Obtain the specified lock level upon the given object, implicitly + * checking whether the corresponding database entry still exists. + * @param entity the persistent instance to lock + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#lock(Object, LockMode) + */ + void lock(Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Obtain the specified lock level upon the given object, implicitly + * checking whether the corresponding database entry still exists. + * @param entityName the name of the persistent entity + * @param entity the persistent instance to lock + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#lock(String, Object, LockMode) + */ + void lock(String entityName, Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Persist the given transient instance. + * @param entity the transient instance to persist + * @return the generated identifier + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#save(Object) + */ + Serializable save(Object entity) throws DataAccessException; + + /** + * Persist the given transient instance. + * @param entityName the name of the persistent entity + * @param entity the transient instance to persist + * @return the generated identifier + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#save(String, Object) + */ + Serializable save(String entityName, Object entity) throws DataAccessException; + + /** + * Update the given persistent instance, + * associating it with the current Hibernate {@link org.hibernate.Session}. + * @param entity the persistent instance to update + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#update(Object) + */ + void update(Object entity) throws DataAccessException; + + /** + * Update the given persistent instance, + * associating it with the current Hibernate {@link org.hibernate.Session}. + * <p>Obtains the specified lock mode if the instance exists, implicitly + * checking whether the corresponding database entry still exists. + * @param entity the persistent instance to update + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#update(Object) + */ + void update(Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Update the given persistent instance, + * associating it with the current Hibernate {@link org.hibernate.Session}. + * @param entityName the name of the persistent entity + * @param entity the persistent instance to update + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#update(String, Object) + */ + void update(String entityName, Object entity) throws DataAccessException; + + /** + * Update the given persistent instance, + * associating it with the current Hibernate {@link org.hibernate.Session}. + * <p>Obtains the specified lock mode if the instance exists, implicitly + * checking whether the corresponding database entry still exists. + * @param entityName the name of the persistent entity + * @param entity the persistent instance to update + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#update(String, Object) + */ + void update(String entityName, Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Save or update the given persistent instance, + * according to its id (matching the configured "unsaved-value"?). + * Associates the instance with the current Hibernate {@link org.hibernate.Session}. + * @param entity the persistent instance to save or update + * (to be associated with the Hibernate {@code Session}) + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#saveOrUpdate(Object) + */ + void saveOrUpdate(Object entity) throws DataAccessException; + + /** + * Save or update the given persistent instance, + * according to its id (matching the configured "unsaved-value"?). + * Associates the instance with the current Hibernate {@code Session}. + * @param entityName the name of the persistent entity + * @param entity the persistent instance to save or update + * (to be associated with the Hibernate {@code Session}) + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#saveOrUpdate(String, Object) + */ + void saveOrUpdate(String entityName, Object entity) throws DataAccessException; + + /** + * Persist the state of the given detached instance according to the + * given replication mode, reusing the current identifier value. + * @param entity the persistent object to replicate + * @param replicationMode the Hibernate ReplicationMode + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#replicate(Object, ReplicationMode) + */ + void replicate(Object entity, ReplicationMode replicationMode) throws DataAccessException; + + /** + * Persist the state of the given detached instance according to the + * given replication mode, reusing the current identifier value. + * @param entityName the name of the persistent entity + * @param entity the persistent object to replicate + * @param replicationMode the Hibernate ReplicationMode + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#replicate(String, Object, ReplicationMode) + */ + void replicate(String entityName, Object entity, ReplicationMode replicationMode) throws DataAccessException; + + /** + * Persist the given transient instance. Follows JSR-220 semantics. + * <p>Similar to {@code save}, associating the given object + * with the current Hibernate {@link org.hibernate.Session}. + * @param entity the persistent instance to persist + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#persist(Object) + * @see #save + */ + void persist(Object entity) throws DataAccessException; + + /** + * Persist the given transient instance. Follows JSR-220 semantics. + * <p>Similar to {@code save}, associating the given object + * with the current Hibernate {@link org.hibernate.Session}. + * @param entityName the name of the persistent entity + * @param entity the persistent instance to persist + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#persist(String, Object) + * @see #save + */ + void persist(String entityName, Object entity) throws DataAccessException; + + /** + * Copy the state of the given object onto the persistent object + * with the same identifier. Follows JSR-220 semantics. + * <p>Similar to {@code saveOrUpdate}, but never associates the given + * object with the current Hibernate Session. In case of a new entity, + * the state will be copied over as well. + * <p>Note that {@code merge} will <i>not</i> update the identifiers + * in the passed-in object graph (in contrast to TopLink)! Consider + * registering Spring's {@code IdTransferringMergeEventListener} if + * you would like to have newly assigned ids transferred to the original + * object graph too. + * @param entity the object to merge with the corresponding persistence instance + * @return the updated, registered persistent instance + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#merge(Object) + * @see #saveOrUpdate + */ + <T> T merge(T entity) throws DataAccessException; + + /** + * Copy the state of the given object onto the persistent object + * with the same identifier. Follows JSR-220 semantics. + * <p>Similar to {@code saveOrUpdate}, but never associates the given + * object with the current Hibernate {@link org.hibernate.Session}. In + * the case of a new entity, the state will be copied over as well. + * <p>Note that {@code merge} will <i>not</i> update the identifiers + * in the passed-in object graph (in contrast to TopLink)! Consider + * registering Spring's {@code IdTransferringMergeEventListener} + * if you would like to have newly assigned ids transferred to the + * original object graph too. + * @param entityName the name of the persistent entity + * @param entity the object to merge with the corresponding persistence instance + * @return the updated, registered persistent instance + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#merge(String, Object) + * @see #saveOrUpdate + */ + <T> T merge(String entityName, T entity) throws DataAccessException; + + /** + * Delete the given persistent instance. + * @param entity the persistent instance to delete + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#delete(Object) + */ + void delete(Object entity) throws DataAccessException; + + /** + * Delete the given persistent instance. + * <p>Obtains the specified lock mode if the instance exists, implicitly + * checking whether the corresponding database entry still exists. + * @param entity the persistent instance to delete + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#delete(Object) + */ + void delete(Object entity, LockMode lockMode) throws DataAccessException; Review Comment: Method HibernateOperations.delete(..) could be confused with overloaded method [delete](1), since dispatch depends on static types. ########## grails-data-hibernate5/core/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java: ########## @@ -0,0 +1,851 @@ +/* + * Copyright 2002-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.grails.orm.hibernate.support.hibernate5; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.hibernate.Filter; +import org.hibernate.LockMode; +import org.hibernate.ReplicationMode; +import org.hibernate.criterion.DetachedCriteria; + +import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; + +/** + * Interface that specifies a common set of Hibernate operations as well as + * a general {@link #execute} method for Session-based lambda expressions. + * Implemented by {@link HibernateTemplate}. Not often used, but a useful option + * to enhance testability, as it can easily be mocked or stubbed. + * + * <p>Defines {@code HibernateTemplate}'s data access methods that mirror various + * {@link org.hibernate.Session} methods. Users are strongly encouraged to read the + * Hibernate {@code Session} javadocs for details on the semantics of those methods. + * + * <p><b>A deprecation note:</b> While {@link HibernateTemplate} and this operations + * interface are being kept around for backwards compatibility in terms of the data + * access implementation style in Spring applications, we strongly recommend the use + * of native {@link org.hibernate.Session} access code for non-trivial interactions. + * This in particular affects parameterized queries where - on Java 8+ - a custom + * {@link HibernateCallback} lambda code block with {@code createQuery} and several + * {@code setParameter} calls on the {@link org.hibernate.query.Query} interface + * is an elegant solution, to be executed via the general {@link #execute} method. + * All such operations which benefit from a lambda variant have been marked as + * {@code deprecated} on this interface. + * + * <p><b>A Hibernate compatibility note:</b> {@link HibernateTemplate} and the + * operations on this interface generally aim to be applicable across all Hibernate + * versions. In terms of binary compatibility, Spring ships a variant for each major + * generation of Hibernate (in the present case: Hibernate ORM 5.x). However, due to + * refactorings and removals in Hibernate ORM 5.3, some variants - in particular + * legacy positional parameters starting from index 0 - do not work anymore. + * All affected operations are marked as deprecated; please replace them with the + * general {@link #execute} method and custom lambda blocks creating the queries, + * ideally setting named parameters through {@link org.hibernate.query.Query}. + * <b>Please be aware that deprecated operations are known to work with Hibernate + * ORM 5.2 but may not work with Hibernate ORM 5.3 and higher anymore.</b> + * + * @author Juergen Hoeller + * @since 4.2 + * @see HibernateTemplate + * @see org.hibernate.Session + * @see HibernateTransactionManager + */ +public interface HibernateOperations { + + /** + * Execute the action specified by the given action object within a + * {@link org.hibernate.Session}. + * <p>Application exceptions thrown by the action object get propagated + * to the caller (can only be unchecked). Hibernate exceptions are + * transformed into appropriate DAO ones. Allows for returning a result + * object, that is a domain object or a collection of domain objects. + * <p>Note: Callback code is not supposed to handle transactions itself! + * Use an appropriate transaction manager like + * {@link HibernateTransactionManager}. Generally, callback code must not + * touch any {@code Session} lifecycle methods, like close, + * disconnect, or reconnect, to let the template do its work. + * @param action callback object that specifies the Hibernate action + * @return a result object returned by the action, or {@code null} + * @throws DataAccessException in case of Hibernate errors + * @see HibernateTransactionManager + * @see org.hibernate.Session + */ + @Nullable + <T> T execute(HibernateCallback<T> action) throws DataAccessException; + + //------------------------------------------------------------------------- + // Convenience methods for loading individual objects + //------------------------------------------------------------------------- + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + Object get(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + Object get(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + Object load(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + Object load(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return all persistent instances of the given entity class. + * Note: Use queries or criteria for retrieving a specific subset. + * @param entityClass a persistent class + * @return a {@link List} containing 0 or more persistent instances + * @throws DataAccessException if there is a Hibernate error + * @see org.hibernate.Session#createCriteria + */ + <T> List<T> loadAll(Class<T> entityClass) throws DataAccessException; + + /** + * Load the persistent instance with the given identifier + * into the given object, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Object, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entity the object (of the target class) to load into + * @param id the identifier of the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Object, Serializable) + */ + void load(Object entity, Serializable id) throws DataAccessException; + + /** + * Re-read the state of the given persistent instance. + * @param entity the persistent instance to re-read + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#refresh(Object) + */ + void refresh(Object entity) throws DataAccessException; + + /** + * Re-read the state of the given persistent instance. + * Obtains the specified lock mode for the instance. + * @param entity the persistent instance to re-read + * @param lockMode the lock mode to obtain + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#refresh(Object, LockMode) + */ + void refresh(Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Check whether the given object is in the Session cache. + * @param entity the persistence instance to check + * @return whether the given object is in the Session cache + * @throws DataAccessException if there is a Hibernate error + * @see org.hibernate.Session#contains + */ + boolean contains(Object entity) throws DataAccessException; + + /** + * Remove the given object from the {@link org.hibernate.Session} cache. + * @param entity the persistent instance to evict + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#evict + */ + void evict(Object entity) throws DataAccessException; + + /** + * Force initialization of a Hibernate proxy or persistent collection. + * @param proxy a proxy for a persistent object or a persistent collection + * @throws DataAccessException if we can't initialize the proxy, for example + * because it is not associated with an active Session + * @see org.hibernate.Hibernate#initialize + */ + void initialize(Object proxy) throws DataAccessException; + + /** + * Return an enabled Hibernate {@link Filter} for the given filter name. + * The returned {@code Filter} instance can be used to set filter parameters. + * @param filterName the name of the filter + * @return the enabled Hibernate {@code Filter} (either already + * enabled or enabled on the fly by this operation) + * @throws IllegalStateException if we are not running within a + * transactional Session (in which case this operation does not make sense) + */ + Filter enableFilter(String filterName) throws IllegalStateException; + + //------------------------------------------------------------------------- + // Convenience methods for storing individual objects + //------------------------------------------------------------------------- + + /** + * Obtain the specified lock level upon the given object, implicitly + * checking whether the corresponding database entry still exists. + * @param entity the persistent instance to lock + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#lock(Object, LockMode) + */ + void lock(Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Obtain the specified lock level upon the given object, implicitly + * checking whether the corresponding database entry still exists. + * @param entityName the name of the persistent entity + * @param entity the persistent instance to lock + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#lock(String, Object, LockMode) + */ + void lock(String entityName, Object entity, LockMode lockMode) throws DataAccessException; + + /** + * Persist the given transient instance. + * @param entity the transient instance to persist + * @return the generated identifier + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#save(Object) + */ + Serializable save(Object entity) throws DataAccessException; + + /** + * Persist the given transient instance. + * @param entityName the name of the persistent entity + * @param entity the transient instance to persist + * @return the generated identifier + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#save(String, Object) + */ + Serializable save(String entityName, Object entity) throws DataAccessException; + + /** + * Update the given persistent instance, + * associating it with the current Hibernate {@link org.hibernate.Session}. + * @param entity the persistent instance to update + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#update(Object) + */ + void update(Object entity) throws DataAccessException; + + /** + * Update the given persistent instance, + * associating it with the current Hibernate {@link org.hibernate.Session}. + * <p>Obtains the specified lock mode if the instance exists, implicitly + * checking whether the corresponding database entry still exists. + * @param entity the persistent instance to update + * @param lockMode the lock mode to obtain + * @throws org.springframework.orm.ObjectOptimisticLockingFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#update(Object) + */ + void update(Object entity, LockMode lockMode) throws DataAccessException; Review Comment: Method HibernateOperations.update(..) could be confused with overloaded method [update](1), since dispatch depends on static types. ########## grails-data-hibernate5/core/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java: ########## @@ -0,0 +1,851 @@ +/* + * Copyright 2002-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.grails.orm.hibernate.support.hibernate5; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.hibernate.Filter; +import org.hibernate.LockMode; +import org.hibernate.ReplicationMode; +import org.hibernate.criterion.DetachedCriteria; + +import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; + +/** + * Interface that specifies a common set of Hibernate operations as well as + * a general {@link #execute} method for Session-based lambda expressions. + * Implemented by {@link HibernateTemplate}. Not often used, but a useful option + * to enhance testability, as it can easily be mocked or stubbed. + * + * <p>Defines {@code HibernateTemplate}'s data access methods that mirror various + * {@link org.hibernate.Session} methods. Users are strongly encouraged to read the + * Hibernate {@code Session} javadocs for details on the semantics of those methods. + * + * <p><b>A deprecation note:</b> While {@link HibernateTemplate} and this operations + * interface are being kept around for backwards compatibility in terms of the data + * access implementation style in Spring applications, we strongly recommend the use + * of native {@link org.hibernate.Session} access code for non-trivial interactions. + * This in particular affects parameterized queries where - on Java 8+ - a custom + * {@link HibernateCallback} lambda code block with {@code createQuery} and several + * {@code setParameter} calls on the {@link org.hibernate.query.Query} interface + * is an elegant solution, to be executed via the general {@link #execute} method. + * All such operations which benefit from a lambda variant have been marked as + * {@code deprecated} on this interface. + * + * <p><b>A Hibernate compatibility note:</b> {@link HibernateTemplate} and the + * operations on this interface generally aim to be applicable across all Hibernate + * versions. In terms of binary compatibility, Spring ships a variant for each major + * generation of Hibernate (in the present case: Hibernate ORM 5.x). However, due to + * refactorings and removals in Hibernate ORM 5.3, some variants - in particular + * legacy positional parameters starting from index 0 - do not work anymore. + * All affected operations are marked as deprecated; please replace them with the + * general {@link #execute} method and custom lambda blocks creating the queries, + * ideally setting named parameters through {@link org.hibernate.query.Query}. + * <b>Please be aware that deprecated operations are known to work with Hibernate + * ORM 5.2 but may not work with Hibernate ORM 5.3 and higher anymore.</b> + * + * @author Juergen Hoeller + * @since 4.2 + * @see HibernateTemplate + * @see org.hibernate.Session + * @see HibernateTransactionManager + */ +public interface HibernateOperations { + + /** + * Execute the action specified by the given action object within a + * {@link org.hibernate.Session}. + * <p>Application exceptions thrown by the action object get propagated + * to the caller (can only be unchecked). Hibernate exceptions are + * transformed into appropriate DAO ones. Allows for returning a result + * object, that is a domain object or a collection of domain objects. + * <p>Note: Callback code is not supposed to handle transactions itself! + * Use an appropriate transaction manager like + * {@link HibernateTransactionManager}. Generally, callback code must not + * touch any {@code Session} lifecycle methods, like close, + * disconnect, or reconnect, to let the template do its work. + * @param action callback object that specifies the Hibernate action + * @return a result object returned by the action, or {@code null} + * @throws DataAccessException in case of Hibernate errors + * @see HibernateTransactionManager + * @see org.hibernate.Session + */ + @Nullable + <T> T execute(HibernateCallback<T> action) throws DataAccessException; + + //------------------------------------------------------------------------- + // Convenience methods for loading individual objects + //------------------------------------------------------------------------- + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + Object get(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + Object get(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id) throws DataAccessException; Review Comment: Method HibernateOperations.load(..) could be confused with overloaded method [load](1), since dispatch depends on static types. ########## grails-data-hibernate5/core/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java: ########## @@ -0,0 +1,851 @@ +/* + * Copyright 2002-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.grails.orm.hibernate.support.hibernate5; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.hibernate.Filter; +import org.hibernate.LockMode; +import org.hibernate.ReplicationMode; +import org.hibernate.criterion.DetachedCriteria; + +import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; + +/** + * Interface that specifies a common set of Hibernate operations as well as + * a general {@link #execute} method for Session-based lambda expressions. + * Implemented by {@link HibernateTemplate}. Not often used, but a useful option + * to enhance testability, as it can easily be mocked or stubbed. + * + * <p>Defines {@code HibernateTemplate}'s data access methods that mirror various + * {@link org.hibernate.Session} methods. Users are strongly encouraged to read the + * Hibernate {@code Session} javadocs for details on the semantics of those methods. + * + * <p><b>A deprecation note:</b> While {@link HibernateTemplate} and this operations + * interface are being kept around for backwards compatibility in terms of the data + * access implementation style in Spring applications, we strongly recommend the use + * of native {@link org.hibernate.Session} access code for non-trivial interactions. + * This in particular affects parameterized queries where - on Java 8+ - a custom + * {@link HibernateCallback} lambda code block with {@code createQuery} and several + * {@code setParameter} calls on the {@link org.hibernate.query.Query} interface + * is an elegant solution, to be executed via the general {@link #execute} method. + * All such operations which benefit from a lambda variant have been marked as + * {@code deprecated} on this interface. + * + * <p><b>A Hibernate compatibility note:</b> {@link HibernateTemplate} and the + * operations on this interface generally aim to be applicable across all Hibernate + * versions. In terms of binary compatibility, Spring ships a variant for each major + * generation of Hibernate (in the present case: Hibernate ORM 5.x). However, due to + * refactorings and removals in Hibernate ORM 5.3, some variants - in particular + * legacy positional parameters starting from index 0 - do not work anymore. + * All affected operations are marked as deprecated; please replace them with the + * general {@link #execute} method and custom lambda blocks creating the queries, + * ideally setting named parameters through {@link org.hibernate.query.Query}. + * <b>Please be aware that deprecated operations are known to work with Hibernate + * ORM 5.2 but may not work with Hibernate ORM 5.3 and higher anymore.</b> + * + * @author Juergen Hoeller + * @since 4.2 + * @see HibernateTemplate + * @see org.hibernate.Session + * @see HibernateTransactionManager + */ +public interface HibernateOperations { + + /** + * Execute the action specified by the given action object within a + * {@link org.hibernate.Session}. + * <p>Application exceptions thrown by the action object get propagated + * to the caller (can only be unchecked). Hibernate exceptions are + * transformed into appropriate DAO ones. Allows for returning a result + * object, that is a domain object or a collection of domain objects. + * <p>Note: Callback code is not supposed to handle transactions itself! + * Use an appropriate transaction manager like + * {@link HibernateTransactionManager}. Generally, callback code must not + * touch any {@code Session} lifecycle methods, like close, + * disconnect, or reconnect, to let the template do its work. + * @param action callback object that specifies the Hibernate action + * @return a result object returned by the action, or {@code null} + * @throws DataAccessException in case of Hibernate errors + * @see HibernateTransactionManager + * @see org.hibernate.Session + */ + @Nullable + <T> T execute(HibernateCallback<T> action) throws DataAccessException; + + //------------------------------------------------------------------------- + // Convenience methods for loading individual objects + //------------------------------------------------------------------------- + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + <T> T get(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable) + */ + @Nullable + Object get(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, or {@code null} if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#get(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance, or {@code null} if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#get(Class, Serializable, LockMode) + */ + @Nullable + Object get(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Class, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityClass a persistent class + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + <T> T load(Class<T> entityClass, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(String, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + Object load(String entityName, Serializable id) throws DataAccessException; + + /** + * Return the persistent instance of the given entity class + * with the given identifier, throwing an exception if not found. + * <p>Obtains the specified lock mode if the instance exists. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(String, Serializable, LockMode)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entityName the name of the persistent entity + * @param id the identifier of the persistent instance + * @param lockMode the lock mode to obtain + * @return the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Class, Serializable) + */ + Object load(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; + + /** + * Return all persistent instances of the given entity class. + * Note: Use queries or criteria for retrieving a specific subset. + * @param entityClass a persistent class + * @return a {@link List} containing 0 or more persistent instances + * @throws DataAccessException if there is a Hibernate error + * @see org.hibernate.Session#createCriteria + */ + <T> List<T> loadAll(Class<T> entityClass) throws DataAccessException; + + /** + * Load the persistent instance with the given identifier + * into the given object, throwing an exception if not found. + * <p>This method is a thin wrapper around + * {@link org.hibernate.Session#load(Object, Serializable)} for convenience. + * For an explanation of the exact semantics of this method, please do refer to + * the Hibernate API documentation in the first instance. + * @param entity the object (of the target class) to load into + * @param id the identifier of the persistent instance + * @throws org.springframework.orm.ObjectRetrievalFailureException if not found + * @throws DataAccessException in case of Hibernate errors + * @see org.hibernate.Session#load(Object, Serializable) + */ + void load(Object entity, Serializable id) throws DataAccessException; Review Comment: Method HibernateOperations.load(..) could be confused with overloaded method [load](1), since dispatch depends on static types. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
