From 626db6dea7a284ef5f6fc7077765b01870eaa6a3 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Wed, 19 Feb 2025 18:56:00 +0100 Subject: [PATCH] HHH-19171 add SharedSessionContract.inTransaction --- .../org/hibernate/SharedSessionContract.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java index 091e06db689c..640f4e42278d 100644 --- a/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java @@ -6,6 +6,8 @@ import java.io.Serializable; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; import jakarta.persistence.EntityGraph; import org.hibernate.graph.RootGraph; @@ -15,6 +17,8 @@ import org.hibernate.query.QueryProducer; import org.hibernate.query.criteria.HibernateCriteriaBuilder; +import static org.hibernate.internal.TransactionManagement.manageTransaction; + /** * Declares operations that are common between {@link Session} and {@link StatelessSession}. * @@ -432,4 +436,31 @@ public interface SharedSessionContract extends QueryProducer, AutoCloseable, Ser * The factory which created this session. */ SessionFactory getFactory(); + + /** + * Perform an action within the bounds of a {@linkplain Transaction + * transaction} associated with this session. + * + * @param action a void function which accepts the {@link Transaction} + * + * @since 7.0 + */ + default void inTransaction(Consumer action) { + final Transaction transaction = beginTransaction(); + manageTransaction( transaction, transaction, action ); + } + + /** + * Obtain a value within the bounds of a {@linkplain Transaction + * transaction} associated with this session. + * + * @param action a function which accepts the {@link Transaction} and + * returns the value + * + * @since 7.0 + */ + default R fromTransaction(Function action) { + final Transaction transaction = beginTransaction(); + return manageTransaction( transaction, transaction, action ); + } }