diff --git a/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java index 1285333e7b..0d96710d1a 100644 --- a/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java @@ -8,6 +8,11 @@ import java.io.Serializable; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaDelete; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.CriteriaUpdate; + import org.hibernate.procedure.ProcedureCall; import org.hibernate.query.QueryProducer; @@ -139,4 +144,23 @@ public interface SharedSessionContract extends QueryProducer, Serializable { * @see org.hibernate.boot.SessionFactoryBuilder#applyJdbcBatchSize */ void setJdbcBatchSize(Integer jdbcBatchSize); + + /** + * Return an instance of {@link CriteriaBuilder} + * + * @return an instance of CriteriaBuilder + * @throws IllegalStateException if the StatelessSession has been closed + */ + CriteriaBuilder getCriteriaBuilder(); + + @Override + org.hibernate.query.Query createQuery(String queryString, Class resultType); + + org.hibernate.query.Query createQuery(CriteriaQuery criteriaQuery); + + org.hibernate.query.Query createQuery(CriteriaUpdate updateQuery); + + org.hibernate.query.Query createQuery(CriteriaDelete deleteQuery); + + org.hibernate.query.Query createNamedQuery(String name, Class resultType); } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java index 3b3e8c197e..2c66e9d97e 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java @@ -16,11 +16,10 @@ import java.util.UUID; import javax.persistence.FlushModeType; import javax.persistence.TransactionRequiredException; -import javax.persistence.Tuple; +import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaDelete; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaUpdate; -import javax.persistence.criteria.Selection; import org.hibernate.CacheMode; import org.hibernate.EmptyInterceptor; @@ -56,7 +55,6 @@ import org.hibernate.engine.transaction.internal.TransactionImpl; import org.hibernate.engine.transaction.spi.TransactionImplementor; import org.hibernate.id.uuid.StandardRandomStrategy; -import org.hibernate.internal.util.StringHelper; import org.hibernate.jpa.internal.util.FlushModeTypeHelper; import org.hibernate.jpa.spi.NativeQueryTupleTransformer; import org.hibernate.jpa.spi.TupleBuilderTransformer; @@ -73,9 +71,10 @@ import org.hibernate.query.sql.internal.NativeQueryImpl; import org.hibernate.query.sql.spi.NamedNativeQueryMemento; import org.hibernate.query.sql.spi.NativeQueryImplementor; -import org.hibernate.query.sql.spi.ResultSetMappingDescriptor; import org.hibernate.query.sqm.internal.QuerySqmImpl; import org.hibernate.query.sqm.tree.SqmStatement; +import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement; +import org.hibernate.query.sqm.tree.update.SqmUpdateStatement; import org.hibernate.resource.jdbc.spi.JdbcSessionContext; import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl; @@ -862,6 +861,62 @@ public void setJdbcBatchSize(Integer jdbcBatchSize) { this.jdbcBatchSize = jdbcBatchSize; } + @Override + public CriteriaBuilder getCriteriaBuilder() { + checkOpen(); + return getFactory().getCriteriaBuilder(); + } + + @Override + public QueryImplementor createQuery(CriteriaQuery criteriaQuery) { + checkOpen(); + + try { + return new QuerySqmImpl<>( + "", + (SqmStatement) criteriaQuery, + criteriaQuery.getResultType(), + this + ); + } + catch ( RuntimeException e ) { + throw exceptionConverter.convert( e ); + } + } + + @Override + public QueryImplementor createQuery(CriteriaUpdate criteriaUpdate) { + checkOpen(); + try { + return new QuerySqmImpl<>( + "", + (SqmUpdateStatement) criteriaUpdate, + null, + this + ); + } + catch ( RuntimeException e ) { + throw exceptionConverter.convert( e ); + } + } + + @Override + public QueryImplementor createQuery(CriteriaDelete criteriaDelete) { + checkOpen(); + try { + return new QuerySqmImpl<>( + "", + (SqmDeleteStatement) criteriaDelete, + null, + this + ); + } + catch ( RuntimeException e ) { + throw exceptionConverter.convert( e ); + } + } + + @SuppressWarnings("unused") private void writeObject(ObjectOutputStream oos) throws IOException { if ( log.isTraceEnabled() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index 5683e98b2c..8af576ca48 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -3104,56 +3104,6 @@ public Map getProperties() { return Collections.unmodifiableMap( properties ); } - - @Override - public QueryImplementor createQuery(CriteriaQuery criteriaQuery) { - checkOpen(); - - try { - return new QuerySqmImpl<>( - "", - (SqmStatement) criteriaQuery, - criteriaQuery.getResultType(), - this - ); - } - catch ( RuntimeException e ) { - throw exceptionConverter.convert( e ); - } - } - - @Override - public QueryImplementor createQuery(CriteriaUpdate criteriaUpdate) { - checkOpen(); - try { - return new QuerySqmImpl<>( - "", - (SqmUpdateStatement) criteriaUpdate, - null, - this - ); - } - catch ( RuntimeException e ) { - throw exceptionConverter.convert( e ); - } - } - - @Override - public QueryImplementor createQuery(CriteriaDelete criteriaDelete) { - checkOpen(); - try { - return new QuerySqmImpl<>( - "", - (SqmDeleteStatement) criteriaDelete, - null, - this - ); - } - catch ( RuntimeException e ) { - throw exceptionConverter.convert( e ); - } - } - @Override public StoredProcedureQuery createNamedStoredProcedureQuery(String name) { checkOpen(); @@ -3271,12 +3221,6 @@ public SessionFactoryImplementor getEntityManagerFactory() { return getFactory(); } - @Override - public CriteriaBuilder getCriteriaBuilder() { - checkOpen(); - return getFactory().getCriteriaBuilder(); - } - @Override public MetamodelImplementor getMetamodel() { checkOpen(); diff --git a/hibernate-core/src/test/java/org/hibernate/test/stateless/StatelessSessionTest.java b/hibernate-core/src/test/java/org/hibernate/test/stateless/StatelessSessionTest.java index 12327d8e64..e7a43b3e9c 100755 --- a/hibernate-core/src/test/java/org/hibernate/test/stateless/StatelessSessionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/stateless/StatelessSessionTest.java @@ -8,6 +8,9 @@ import java.util.Date; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; + import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.StatelessSession; @@ -30,65 +33,79 @@ public String[] getMappings() { @Test public void testCreateUpdateReadDelete() { - StatelessSession ss = sessionFactory().openStatelessSession(); - Transaction tx = ss.beginTransaction(); - Document doc = new Document("blah blah blah", "Blahs"); - ss.insert(doc); - assertNotNull( doc.getName() ); - Date initVersion = doc.getLastModified(); - assertNotNull( initVersion ); - tx.commit(); + try (StatelessSession ss = sessionFactory().openStatelessSession()) { + try { + Transaction tx = ss.beginTransaction(); + Document doc = new Document( "blah blah blah", "Blahs" ); + ss.insert( doc ); + assertNotNull( doc.getName() ); + Date initVersion = doc.getLastModified(); + assertNotNull( initVersion ); + tx.commit(); - tx = ss.beginTransaction(); - doc.setText("blah blah blah .... blah"); - ss.update(doc); - assertNotNull( doc.getLastModified() ); - assertNotSame( doc.getLastModified(), initVersion ); - tx.commit(); + tx = ss.beginTransaction(); + doc.setText( "blah blah blah .... blah" ); + ss.update( doc ); + assertNotNull( doc.getLastModified() ); + assertNotSame( doc.getLastModified(), initVersion ); + tx.commit(); - tx = ss.beginTransaction(); - doc.setText("blah blah blah .... blah blay"); - ss.update(doc); - tx.commit(); - - Document doc2 = (Document) ss.get(Document.class.getName(), "Blahs"); - assertEquals("Blahs", doc2.getName()); - assertEquals(doc.getText(), doc2.getText()); - - doc2 = (Document) ss.createQuery("from Document where text is not null").uniqueResult(); - assertEquals("Blahs", doc2.getName()); - assertEquals(doc.getText(), doc2.getText()); - - ScrollableResults sr = ss.createQuery("from Document where text is not null") - .scroll(ScrollMode.FORWARD_ONLY); - sr.next(); - doc2 = (Document) sr.get(); - sr.close(); - assertEquals("Blahs", doc2.getName()); - assertEquals(doc.getText(), doc2.getText()); - - doc2 = (Document) ss.createNativeQuery( "select * from Document") - .addEntity(Document.class) - .uniqueResult(); - assertEquals("Blahs", doc2.getName()); - assertEquals(doc.getText(), doc2.getText()); + tx = ss.beginTransaction(); + doc.setText( "blah blah blah .... blah blay" ); + ss.update( doc ); + tx.commit(); + + Document doc2 = (Document) ss.get( Document.class.getName(), "Blahs" ); + assertEquals( "Blahs", doc2.getName() ); + assertEquals( doc.getText(), doc2.getText() ); + + doc2 = (Document) ss.createQuery( "from Document where text is not null" ).uniqueResult(); + assertEquals( "Blahs", doc2.getName() ); + assertEquals( doc.getText(), doc2.getText() ); + + ScrollableResults sr = ss.createQuery( "from Document where text is not null" ) + .scroll( ScrollMode.FORWARD_ONLY ); + sr.next(); + doc2 = (Document) sr.get(); + sr.close(); + assertEquals( "Blahs", doc2.getName() ); + assertEquals( doc.getText(), doc2.getText() ); + + doc2 = (Document) ss.createNativeQuery( "select * from Document" ) + .addEntity( Document.class ) + .uniqueResult(); + assertEquals( "Blahs", doc2.getName() ); + assertEquals( doc.getText(), doc2.getText() ); - doc2 = (Document) ss.createCriteria(Document.class).uniqueResult(); - assertEquals("Blahs", doc2.getName()); - assertEquals(doc.getText(), doc2.getText()); - - sr = ss.createCriteria(Document.class).scroll(ScrollMode.FORWARD_ONLY); - sr.next(); - doc2 = (Document) sr.get(); - sr.close(); - assertEquals("Blahs", doc2.getName()); - assertEquals(doc.getText(), doc2.getText()); + CriteriaBuilder criteriaBuilder = ss.getCriteriaBuilder(); + CriteriaQuery criteria = criteriaBuilder.createQuery( Document.class ); + criteria.from( Document.class ); + doc2 = ss.createQuery( criteria ).uniqueResult(); + assertEquals( "Blahs", doc2.getName() ); + assertEquals( doc.getText(), doc2.getText() ); - tx = ss.beginTransaction(); - ss.delete(doc); - tx.commit(); - ss.close(); + criteria = criteriaBuilder.createQuery( Document.class ); + criteria.from( Document.class ); + + sr = ss.createQuery( criteria ).scroll( ScrollMode.FORWARD_ONLY ); + sr.next(); + doc2 = (Document) sr.get(); + sr.close(); + assertEquals( "Blahs", doc2.getName() ); + assertEquals( doc.getText(), doc2.getText() ); + + tx = ss.beginTransaction(); + ss.delete( doc ); + tx.commit(); + } + catch (Exception e) { + if ( ss.getTransaction().isActive() ) { + ss.getTransaction().rollback(); + } + throw e; + } + } } @Test