{"id":21347,"date":"2014-02-04T13:00:38","date_gmt":"2014-02-04T11:00:38","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=21347"},"modified":"2014-02-04T09:15:03","modified_gmt":"2014-02-04T07:15:03","slug":"hibernate-facts-how-to-assert-the-sql-statement-count","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html","title":{"rendered":"Hibernate Facts: How to &#8220;assert&#8221; the SQL statement count"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no different. I\u2019ve already talked about the importance of <a href=\"http:\/\/vladmihalcea.com\/2014\/02\/01\/taming-jpa-with-the-sql-statement-count-validator\/2013\/10\/17\/hibernate-facts-the-importance-of-fetch-stratgey\/\">fetching strategy<\/a> and knowing your <a href=\"2013\/12\/10\/hibernate-facts-always-check-criteria-api-sql-queries\/\">Criteria SQL queries<\/a>, but there is more you can do to rule over JPA. This post is about controlling the SQL statement count that Hibernate calls on your behalf.<\/p>\n<p>Before ORM tools got so popular, all database interactions were done through explicit SQL statements, and optimizations were mostly targeted towards slow queries.<\/p>\n<p>Hibernate may give the false impression that you don\u2019t need to worry about SQL statements. This is a wrong and dangerous assumption. Hibernate is supposed to ease domain model persistence, not to free you from any SQL interaction.<\/p>\n<p>With Hibernate, you manage entity state transitions which are then translated to SQL statements. The number of generated SQL statements is affected by the current fetching strategy, Criteria queries or Collection mappings and you might not always get what you expected. Ignoring SQL statements is risky and it may eventually put a heavy toll on the overall application performance.<\/p>\n<p>I\u2019m a strong advocate of peer reviewing, but that\u2019s not \u201csine qua non\u201d for detecting bad Hibernate usage. Subtle changes may affect the SQL statement count and pass unnoticed through the reviewing process. Not in the least, when it comes to \u201cguessing\u201d the JPA SQL statements, I feel like I can use any extra help. I\u2019m for as much automation as possible, and that\u2019s why I came up with a mechanism for enforcing the SQL statement count expectations.<\/p>\n<p>First, we need a way to intercept all executed SQL statements. I researched on this topic and I was lucky to find this great <a href=\"https:\/\/github.com\/ttddyy\/datasource-proxy\">datasource-proxy<\/a> library.<\/p>\n<h2>Adding an automated validator<\/h2>\n<p>This safeguard is meant to run only during the testing phase, so I\u2019ll add it to the Integration Testing spring context exclusively. I\u2019ve already talked about <a href=\"2013\/12\/15\/why-i-like-spring-bean-aliasing\/\">Spring bean aliasing<\/a> and this is the right time to make use of it.<\/p>\n<pre class=\" brush:xml\">&lt;bean id=\"testDataSource\" class=\"bitronix.tm.resource.jdbc.PoolingDataSource\" init-method=\"init\"\r\n\t  destroy-method=\"close\"&gt;\r\n\t&lt;property name=\"className\" value=\"bitronix.tm.resource.jdbc.lrc.LrcXADataSource\"\/&gt;\r\n\t&lt;property name=\"uniqueName\" value=\"testDataSource\"\/&gt;\r\n\t&lt;property name=\"minPoolSize\" value=\"0\"\/&gt;\r\n\t&lt;property name=\"maxPoolSize\" value=\"5\"\/&gt;\r\n\t&lt;property name=\"allowLocalTransactions\" value=\"false\" \/&gt;\r\n\t&lt;property name=\"driverProperties\"&gt;\r\n\t\t&lt;props&gt;\r\n\t\t\t&lt;prop key=\"user\"&gt;${jdbc.username}&lt;\/prop&gt;\r\n\t\t\t&lt;prop key=\"password\"&gt;${jdbc.password}&lt;\/prop&gt;\r\n\t\t\t&lt;prop key=\"url\"&gt;${jdbc.url}&lt;\/prop&gt;\r\n\t\t\t&lt;prop key=\"driverClassName\"&gt;${jdbc.driverClassName}&lt;\/prop&gt;\r\n\t\t&lt;\/props&gt;\r\n\t&lt;\/property&gt;\r\n&lt;\/bean&gt;\r\n\r\n&lt;bean id=\"proxyDataSource\" class=\"net.ttddyy.dsproxy.support.ProxyDataSource\"&gt;\r\n\t&lt;property name=\"dataSource\" ref=\"testDataSource\"\/&gt;\r\n\t&lt;property name=\"listener\"&gt;\r\n\t\t&lt;bean class=\"net.ttddyy.dsproxy.listener.ChainListener\"&gt;\r\n\t\t\t&lt;property name=\"listeners\"&gt;\r\n\t\t\t\t&lt;list&gt;\r\n\t\t\t\t\t&lt;bean class=\"net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener\"&gt;\r\n\t\t\t\t\t\t&lt;property name=\"logLevel\" value=\"INFO\"\/&gt;\r\n\t\t\t\t\t&lt;\/bean&gt;\r\n\t\t\t\t\t&lt;bean class=\"net.ttddyy.dsproxy.listener.DataSourceQueryCountListener\"\/&gt;\r\n\t\t\t\t&lt;\/list&gt;\r\n\t\t\t&lt;\/property&gt;\r\n\t\t&lt;\/bean&gt;\r\n\t&lt;\/property&gt;\r\n&lt;\/bean&gt;\r\n\r\n&lt;alias name=\"proxyDataSource\" alias=\"dataSource\"\/&gt;<\/pre>\n<p>The new proxy data source decorates the already existing data source, intercepting all executed SQL statements. This library can log all SQL statements along with the actual parameter values, unlike the default Hibernate logging which only prints a placeholder instead.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>This is how the validator looks like:<\/p>\n<pre class=\" brush:java\">public class SQLStatementCountValidator {\r\n\r\n    private SQLStatementCountValidator() {\r\n    }\r\n\r\n    \/**\r\n     * Reset the statement recorder\r\n     *\/\r\n    public static void reset() {\r\n        QueryCountHolder.clear();\r\n    }\r\n\r\n    \/**\r\n     * Assert select statement count\r\n     * @param expectedSelectCount expected select statement count\r\n     *\/\r\n    public static void assertSelectCount(int expectedSelectCount) {\r\n        QueryCount queryCount = QueryCountHolder.getGrandTotal();\r\n        int recordedSelectCount = queryCount.getSelect();\r\n        if(expectedSelectCount != recordedSelectCount) {\r\n            throw new SQLSelectCountMismatchException(expectedSelectCount, recordedSelectCount);\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * Assert insert statement count\r\n     * @param expectedInsertCount expected insert statement count\r\n     *\/\r\n    public static void assertInsertCount(int expectedInsertCount) {\r\n        QueryCount queryCount = QueryCountHolder.getGrandTotal();\r\n        int recordedInsertCount = queryCount.getInsert();\r\n        if(expectedInsertCount != recordedInsertCount) {\r\n            throw new SQLInsertCountMismatchException(expectedInsertCount, recordedInsertCount);\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * Assert update statement count\r\n     * @param expectedUpdateCount expected update statement count\r\n     *\/\r\n    public static void assertUpdateCount(int expectedUpdateCount) {\r\n        QueryCount queryCount = QueryCountHolder.getGrandTotal();\r\n        int recordedUpdateCount = queryCount.getUpdate();\r\n        if(expectedUpdateCount != recordedUpdateCount) {\r\n            throw new SQLUpdateCountMismatchException(expectedUpdateCount, recordedUpdateCount);\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * Assert delete statement count\r\n     * @param expectedDeleteCount expected delete statement count\r\n     *\/\r\n    public static void assertDeleteCount(int expectedDeleteCount) {\r\n        QueryCount queryCount = QueryCountHolder.getGrandTotal();\r\n        int recordedDeleteCount = queryCount.getDelete();\r\n        if(expectedDeleteCount != recordedDeleteCount) {\r\n            throw new SQLDeleteCountMismatchException(expectedDeleteCount, recordedDeleteCount);\r\n        }\r\n    }\r\n}<\/pre>\n<p>This utility is part of my <a href=\"https:\/\/github.com\/vladmihalcea\/db-util\">db-util<\/a> project along with the <a href=\"http:\/\/vladmihalcea.com\/2014\/02\/01\/taming-jpa-with-the-sql-statement-count-validator\/2013\/11\/15\/optimistic-locking-retry-with-jpa\/\">JPA<\/a> and <a href=\"2013\/11\/14\/optimistic-locking-retry-with-mongodb\/\">MongoDB<\/a> optimistic concurrency control retry mechanism.<\/p>\n<p>Since it\u2019s already available in Maven Central Repository, you can easily use it by just adding this dependency to your pom.xml:<\/p>\n<pre class=\" brush:xml\">&lt;dependency&gt;\r\n\t&lt;groupId&gt;com.vladmihalcea&lt;\/groupId&gt;\r\n\t&lt;artifactId&gt;db-util&lt;\/artifactId&gt;\r\n\t&lt;version&gt;0.0.1&lt;\/version&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>Let\u2019s write a test for detecting the infamous <a href=\"http:\/\/use-the-index-luke.com\/sql\/join\/nested-loops-join-n1-problem\">N+1 select query problem<\/a>.<\/p>\n<p>For this we will write two service methods, one of them being affected by the aforementioned issue:<\/p>\n<pre class=\" brush:java\">@Override\r\n@Transactional\r\npublic List&lt;WarehouseProductInfo&gt; findAllWithNPlusOne() {\r\n\tList&lt;WarehouseProductInfo&gt; warehouseProductInfos = entityManager.createQuery(\r\n\t\t\t\"from WarehouseProductInfo\", WarehouseProductInfo.class).getResultList();\r\n\tnavigateWarehouseProductInfos(warehouseProductInfos);\r\n\treturn warehouseProductInfos;\r\n}\r\n\r\n@Override\r\n@Transactional\r\npublic List&lt;WarehouseProductInfo&gt; findAllWithFetch() {\r\n\tList&lt;WarehouseProductInfo&gt; warehouseProductInfos = entityManager.createQuery(\r\n\t\t\t\"from WarehouseProductInfo wpi \" +\r\n\t\t\t\"join fetch wpi.product p \" +\r\n\t\t\t\"join fetch p.company\", WarehouseProductInfo.class).getResultList();\r\n\tnavigateWarehouseProductInfos(warehouseProductInfos);\r\n\treturn warehouseProductInfos;\r\n}\r\n\r\nprivate void navigateWarehouseProductInfos(List&lt;WarehouseProductInfo&gt; warehouseProductInfos) {\r\n\tfor(WarehouseProductInfo warehouseProductInfo : warehouseProductInfos) {\r\n\t\twarehouseProductInfo.getProduct();\r\n\t}\r\n}<\/pre>\n<p>The unit test is rather simple to write since it follows the same coding style of any other JUnit assert mechanism.<\/p>\n<pre class=\" brush:java\">try {\r\n\tSQLStatementCountValidator.reset();\r\n\twarehouseProductInfoService.findAllWithNPlusOne();\r\n\tassertSelectCount(1);\r\n} catch (SQLSelectCountMismatchException e) {\r\n\tassertEquals(3, e.getRecorded());\r\n}\r\n\r\nSQLStatementCountValidator.reset();\r\nwarehouseProductInfoService.findAllWithFetch();\r\nassertSelectCount(1);<\/pre>\n<p>Our validator works for all SQL statement types, so let\u2019s check how many SQL INSERTs are being executed by the following service method:<\/p>\n<pre class=\" brush:java\">@Override\r\n@Transactional\r\npublic WarehouseProductInfo newWarehouseProductInfo() {\r\n\r\n\tLOGGER.info(\"newWarehouseProductInfo\");\r\n\r\n\tCompany company = entityManager.createQuery(\"from Company\", Company.class).getResultList().get(0);\r\n\r\n\tProduct product3 = new Product(\"phoneCode\");\r\n\tproduct3.setName(\"Phone\");\r\n\tproduct3.setCompany(company);\r\n\r\n\tWarehouseProductInfo warehouseProductInfo3 = new WarehouseProductInfo();\r\n\twarehouseProductInfo3.setQuantity(19);\r\n\tproduct3.addWarehouse(warehouseProductInfo3);\r\n\r\n\tentityManager.persist(product3);\r\n\treturn warehouseProductInfo3;\r\n}<\/pre>\n<p>And the validator looks like:<\/p>\n<pre class=\" brush:java\">SQLStatementCountValidator.reset();\r\nwarehouseProductInfoService.newWarehouseProductInfo();\r\nassertSelectCount(1);\r\nassertInsertCount(2);<\/pre>\n<p>Let\u2019s check the test logs to convince ourselves of its effectiveness:<\/p>\n<pre class=\" brush:bash\">INFO  [main]: o.v.s.i.WarehouseProductInfoServiceImpl - newWarehouseProductInfo\r\nHibernate: select company0_.id as id1_6_, company0_.name as name2_6_ from Company company0_\r\nINFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:1, Num:1, Query:{[select company0_.id as id1_6_, company0_.name as name2_6_ from Company company0_][]}\r\nHibernate: insert into WarehouseProductInfo (id, quantity) values (default, ?)\r\nINFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into WarehouseProductInfo (id, quantity) values (default, ?)][19]}\r\nHibernate: insert into Product (id, code, company_id, importer_id, name, version) values (default, ?, ?, ?, ?, ?)\r\nINFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into Product (id, code, company_id, importer_id, name, version) values (default, ?, ?, ?, ?, ?)][phoneCode,1,-5,Phone,0]}<\/pre>\n<h2>Conclusion<\/h2>\n<p>Code reviewing is a fine technique, but it\u2019s not enough on large scale development projects. That\u2019s why automatic checking is of paramount importance. Once the test written, you are assured that no future change can break your assumptions.<\/p>\n<ul>\n<li>Code available on <a href=\"https:\/\/github.com\/vladmihalcea\/vladmihalcea.wordpress.com\/tree\/master\/hibernate-facts\">GitHub<\/a>.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<div style=\"border: 1px solid #D8D8D8; background: #FAFAFA; width: 100%; padding-left: 5px;\"><b><i>Reference: <\/i><\/b><a href=\"http:\/\/vladmihalcea.com\/2014\/02\/01\/taming-jpa-with-the-sql-statement-count-validator\/\">Hibernate Facts: How to &#8220;assert&#8221; the SQL statement count<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/jcg\">JCG partner<\/a> Vlad Mihalcea at the <a href=\"http:\/\/vladmihalcea.com\/\">Vlad Mihalcea&#8217;s Blog<\/a> blog.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no different. I\u2019ve already talked about the importance of fetching strategy and knowing your Criteria SQL queries, but there is more you can do to rule over JPA. This post is about controlling the SQL &hellip;<\/p>\n","protected":false},"author":507,"featured_media":153,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[31,244],"class_list":["post-21347","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jboss-hibernate","tag-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hibernate Facts: How to &quot;assert&quot; the SQL statement count<\/title>\n<meta name=\"description\" content=\"Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hibernate Facts: How to &quot;assert&quot; the SQL statement count\" \/>\n<meta property=\"og:description\" content=\"Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/vlad.mihalcea.71\" \/>\n<meta property=\"article:published_time\" content=\"2014-02-04T11:00:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-hibernate-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Vlad Mihalcea\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Vlad Mihalcea\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html\"},\"author\":{\"name\":\"Vlad Mihalcea\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/2c2d5059ee4fd88b1b3b9e52efc5b129\"},\"headline\":\"Hibernate Facts: How to &#8220;assert&#8221; the SQL statement count\",\"datePublished\":\"2014-02-04T11:00:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html\"},\"wordCount\":598,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-hibernate-logo.jpg\",\"keywords\":[\"JBoss Hibernate\",\"SQL\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html\",\"name\":\"Hibernate Facts: How to \\\"assert\\\" the SQL statement count\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-hibernate-logo.jpg\",\"datePublished\":\"2014-02-04T11:00:38+00:00\",\"description\":\"Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-hibernate-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-hibernate-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/02\\\/hibernate-facts-how-to-assert-the-sql-statement-count.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Hibernate Facts: How to &#8220;assert&#8221; the SQL statement count\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/2c2d5059ee4fd88b1b3b9e52efc5b129\",\"name\":\"Vlad Mihalcea\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f9f4ac0b2229b9f9fb993393b822ffbf63e60c1665a244176d3c4728565a9a9f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f9f4ac0b2229b9f9fb993393b822ffbf63e60c1665a244176d3c4728565a9a9f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f9f4ac0b2229b9f9fb993393b822ffbf63e60c1665a244176d3c4728565a9a9f?s=96&d=mm&r=g\",\"caption\":\"Vlad Mihalcea\"},\"description\":\"Vlad Mihalcea is a software architect passionate about software integration, high scalability and concurrency challenges.\",\"sameAs\":[\"http:\\\/\\\/vladmihalcea.wordpress.com\\\/\",\"https:\\\/\\\/www.facebook.com\\\/vlad.mihalcea.71\",\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/vlad-mihalcea\\\/20\\\/a59\\\/580\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/vlad-mihalcea\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hibernate Facts: How to \"assert\" the SQL statement count","description":"Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html","og_locale":"en_US","og_type":"article","og_title":"Hibernate Facts: How to \"assert\" the SQL statement count","og_description":"Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no","og_url":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_author":"https:\/\/www.facebook.com\/vlad.mihalcea.71","article_published_time":"2014-02-04T11:00:38+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-hibernate-logo.jpg","type":"image\/jpeg"}],"author":"Vlad Mihalcea","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Vlad Mihalcea","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html"},"author":{"name":"Vlad Mihalcea","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/2c2d5059ee4fd88b1b3b9e52efc5b129"},"headline":"Hibernate Facts: How to &#8220;assert&#8221; the SQL statement count","datePublished":"2014-02-04T11:00:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html"},"wordCount":598,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-hibernate-logo.jpg","keywords":["JBoss Hibernate","SQL"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html","url":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html","name":"Hibernate Facts: How to \"assert\" the SQL statement count","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-hibernate-logo.jpg","datePublished":"2014-02-04T11:00:38+00:00","description":"Introduction Hibernate simplifies CRUD operations, especially when dealing with entity graphs. But any abstraction has its price and Hibernate is no","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-hibernate-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-hibernate-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2014\/02\/hibernate-facts-how-to-assert-the-sql-statement-count.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Hibernate Facts: How to &#8220;assert&#8221; the SQL statement count"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/2c2d5059ee4fd88b1b3b9e52efc5b129","name":"Vlad Mihalcea","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f9f4ac0b2229b9f9fb993393b822ffbf63e60c1665a244176d3c4728565a9a9f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f9f4ac0b2229b9f9fb993393b822ffbf63e60c1665a244176d3c4728565a9a9f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f9f4ac0b2229b9f9fb993393b822ffbf63e60c1665a244176d3c4728565a9a9f?s=96&d=mm&r=g","caption":"Vlad Mihalcea"},"description":"Vlad Mihalcea is a software architect passionate about software integration, high scalability and concurrency challenges.","sameAs":["http:\/\/vladmihalcea.wordpress.com\/","https:\/\/www.facebook.com\/vlad.mihalcea.71","http:\/\/www.linkedin.com\/pub\/vlad-mihalcea\/20\/a59\/580"],"url":"https:\/\/www.javacodegeeks.com\/author\/vlad-mihalcea"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/21347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/507"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=21347"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/21347\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/153"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=21347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=21347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=21347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}