{"id":1024,"date":"2012-03-08T16:02:00","date_gmt":"2012-03-08T16:02:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/adding-ehcache-to-openxava-application.html"},"modified":"2012-10-21T23:18:50","modified_gmt":"2012-10-21T23:18:50","slug":"adding-ehcache-to-openxava-application","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html","title":{"rendered":"Adding Ehcache to Openxava application"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\"><span style=\"font-size: x-large\">Introduction<\/span><\/p>\n<p>This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance.<\/p>\n<p>When viewing an entity and its graph, relationships are loaded. Adding a&nbsp;second-level cache fasten the retrieval of associated elements, since already loaded elements are retrieved from cache and not database.<\/p>\n<p>Eventually this page explains how minuteproject treats this aspect with keeping its promise: write nothing.<br \/>\nAs an example, we will take the Lazuly minuteproject showcase. <\/p>\n<p><span style=\"font-size: x-large\">Openxava-Ehcache integration<\/span><\/p>\n<p>In Openxava, you describe your model in the manner of Java annotated POJO.The annotations come from the standard JPA2 ORM and Openxava specific ones.<br \/>\nBut nothing prevents you to add others. This is what is done to add caching. There are also couple of configurations to undertake to enable caching.<\/p>\n<p><span style=\"font-size: large\">List of actions<\/span><\/p>\n<ol>\n<li>Add ehcache.xml config file at the root of your sources<\/li>\n<li>Modify persistence.xml to include second level cache<\/li>\n<li>Add caching annotation (alongside JPA2)<\/li>\n<\/ol>\n<p><u>Remark:<\/u><\/p>\n<p>Openxava comes with the ehcache.jar so there is no need to add a dependency.<\/p>\n<ol><\/ol>\n<p><span style=\"font-size: large\">Detailed actions<\/span><\/p>\n<p><strong>Add ehcache.xml<\/strong><\/p>\n<p>In \/persistence place ehcache.xml file<\/p>\n<pre class=\"brush:java\">&lt;ehcache&gt;\r\n    &lt;defaultCache\r\n            maxElementsInMemory=\"1000\"\r\n            eternal=\"false\"\r\n            timeToIdleSeconds=\"300\"\r\n            timeToLiveSeconds=\"300\"\r\n            overflowToDisk=\"false\"\r\n            diskPersistent=\"false\"\r\n            diskExpiryThreadIntervalSeconds=\"300\"\r\n            memoryStoreEvictionPolicy=\"LRU\"\r\n            \/&gt;\r\n   &lt;cache\r\n    name=\"your.domain.object\"\r\n    maxElementsInMemory=\"5000\"\r\n    eternal=\"false\"\r\n    timeToIdleSeconds=\"300\"\r\n    timeToLiveSeconds=\"600\"\r\n    overflowToDisk=\"false\"\r\n   \/&gt;\r\n&lt;\/ehcache&gt;\r\n<\/pre>\n<p><strong>Modify persistence.xml<\/strong><\/p>\n<p>Persistence.xml file contains&nbsp;information related to the persitence unit such as connection pool info,<br \/>\nclass or configuration to load. &#8216;persistence.xml&#8217; is located in \/persistence\/META-INF<\/p>\n<p>We will append properties for L2 cache. <\/p>\n<pre class=\"brush:xml\">&lt;properties&gt;\r\n            &lt;property name=\"hibernate.dialect\" value=\"org.hibernate.dialect.MySQLDialect\"\/&gt;\r\n            &lt;property name=\"hibernate.cache.provider_class\" value=\"net.sf.ehcache.hibernate.SingletonEhCacheProvider\" \/&gt;\r\n            &lt;property name=\"net.sf.ehcache.configurationResourceName\" value=\"\/ehcache.xml\" \/&gt;\r\n            &lt;property name=\"hibernate.cache.use_query_cache\" value=\"true\" \/&gt;\r\n            &lt;property name=\"hibernate.cache.use_second_level_cache\" value=\"true\" \/&gt;\r\n            &lt;property name=\"hibernate.generate_statistics\" value=\"true\" \/&gt;   \r\n\r\n        &lt;\/properties&gt;\r\n<\/pre>\n<p><strong>Add cache annotation<\/strong><\/p>\n<p>Here the hibernate annotation is used instead of the standard one (Cacheable in fact seems not to work)<br \/>\nPlace Cache annotation at class level of your domain object.<\/p>\n<pre class=\"brush:java\">@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)\r\n<\/pre>\n<p><span style=\"font-size: x-large\">Example<\/span><\/p>\n<p><span style=\"font-size: large\"><strong>Lazuly application <\/strong><\/span><\/p>\n<p>Lazuly is a sample database holding conference information used for MinuteProject showcase purpose.<br \/>\nMinuteproject generates a comprehensive set of artefacts to speedup the release of OX application.<br \/>\nFurther information can be found in <a href=\"http:\/\/minuteproject.blogspot.com\/2011\/06\/minuteproject-4-openxava-lazuly.html\">Minuteproject 4 Openxava Lazuly showcase<\/a>.<br \/>\nOn this part we focus on the artefacts generated for the caching specific.<br \/>\nMinuteproject for the generation base itself on a configuration file, where we define the datamodel to reverse engineer. In this configuration there is an enrichement part where you can add information.<br \/>\nOne of this information deals with the type of content is held in an entity. There are 4 possibilities (reference-data, master-data, pseudo-static-data, live-business-data)<br \/>\nIf you enrich your entity with the content-type=&#8221;master-data&#8221; or &#8220;reference-data&#8221; MinuteProject 4 Openxava will generate associated caching.<\/p>\n<p>This is done here for the entity Country.<\/p>\n<pre class=\"brush:xml\">&lt;entity name=\"COUNTRY\" content-type=\"reference-data\"&gt;<\/pre>\n<p><u>Here are the cache related artefacts <\/u><\/p>\n<p><strong>ehcache.xml <\/strong><\/p>\n<pre class=\"brush:xml\">&lt;ehcache&gt;\r\n\r\n  &lt;!--\r\n    Sets the path to the directory where cache files are created.\r\n\r\n    If the path is a Java System Property it is replaced by its value in the\r\n    running VM.\r\n\r\n    The following properties are translated:\r\n    * user.home - User's home directory\r\n    * user.dir - User's current working directory\r\n    * java.io.tmpdir - Default temp file path\r\n\r\n    Subdirectories can be specified below the property e.g. java.io.tmpdir\/one\r\n    --&gt;\r\n&lt;!--MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @ehcache-main-config-conference@--&gt;\r\n    &lt;diskStore path=\"java.io.tmpdir\"\/&gt;\r\n\r\n &lt;!--\r\n    Mandatory Default Cache configuration. These settings will be applied to caches\r\n    created programmtically using CacheManager.add(String cacheName)\r\n    --&gt;\r\n    &lt;defaultCache\r\n            maxElementsInMemory=\"1000\"\r\n            eternal=\"false\"\r\n            timeToIdleSeconds=\"300\"\r\n            timeToLiveSeconds=\"300\"\r\n            overflowToDisk=\"false\"\r\n            diskPersistent=\"false\"\r\n            diskExpiryThreadIntervalSeconds=\"300\"\r\n            memoryStoreEvictionPolicy=\"LRU\"\r\n            \/&gt;\r\n&lt;!-- The unnamed query cache --&gt;\r\n   &lt;cache\r\n    name=\"org.hibernate.cache.StandardQueryCache\"\r\n    maxElementsInMemory=\"1000\"\r\n    eternal=\"false\"\r\n    timeToLiveSeconds=\"300\"\r\n    overflowToDisk=\"false\"\r\n   \/&gt;\r\n&lt;!--MP-MANAGED-UPDATABLE-ENDING--&gt;\r\n\r\n&lt;!--MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @cache-entity-country-conference@--&gt;\r\n   &lt;cache\r\n    name=\"net.sf.mp.demo.conference.domain.admin.Country\"\r\n    maxElementsInMemory=\"5000\"\r\n    eternal=\"false\"\r\n    timeToIdleSeconds=\"300\"\r\n    timeToLiveSeconds=\"600\"\r\n    overflowToDisk=\"false\"\r\n   \/&gt;\r\n&lt;!--MP-MANAGED-UPDATABLE-ENDING--&gt;\r\n\r\n&lt;!--MP-MANAGED-ADDED-AREA-BEGINNING @custom-cache-definition@--&gt;\r\n&lt;!--MP-MANAGED-ADDED-AREA-ENDING @custom-cache-definition@--&gt;\r\n\r\n&lt;\/ehcache&gt;\r\n<\/pre>\n<p><strong>Persistence.xml<\/strong><div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:xml\">&lt;persistence xmlns=\"http:\/\/java.sun.com\/xml\/ns\/persistence\"\r\n             xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n             xsi:schemaLocation=\"http:\/\/java.sun.com\/xml\/ns\/persistence http:\/\/java.sun.com\/xml\/ns\/persistence\/persistence_1_0.xsd\"\r\n             version=\"1.0\"&gt;\r\n             \r\n    &lt;!-- Tomcat + Hypersonic --&gt;\r\n    &lt;persistence-unit name=\"default\"&gt;\r\n     &lt;non-jta-data-source&gt;java:comp\/env\/jdbc\/conferenceDS&lt;\/non-jta-data-source&gt;\r\n     &lt;class&gt;org.openxava.session.GalleryImage&lt;\/class&gt;\r\n        &lt;properties&gt;\r\n            &lt;property name=\"hibernate.dialect\" value=\"org.hibernate.dialect.MySQLDialect\"\/&gt;\r\n            &lt;property name=\"hibernate.cache.provider_class\" value=\"net.sf.ehcache.hibernate.SingletonEhCacheProvider\" \/&gt;\r\n            &lt;property name=\"net.sf.ehcache.configurationResourceName\" value=\"\/ehcache.xml\" \/&gt;\r\n            &lt;property name=\"hibernate.cache.use_query_cache\" value=\"true\" \/&gt;\r\n            &lt;property name=\"hibernate.cache.use_second_level_cache\" value=\"true\" \/&gt;\r\n            &lt;property name=\"hibernate.generate_statistics\" value=\"true\" \/&gt;   \r\n&lt;!--MP-MANAGED-ADDED-AREA-BEGINNING @properties@--&gt;\r\n&lt;!--MP-MANAGED-ADDED-AREA-ENDING @properties@--&gt;\r\n        &lt;\/properties&gt;\r\n&lt;!--MP-MANAGED-ADDED-AREA-BEGINNING @persistence-unit@--&gt;\r\n&lt;!--MP-MANAGED-ADDED-AREA-ENDING @persistence-unit@--&gt;\r\n    &lt;\/persistence-unit&gt;       \r\n\r\n&lt;!--MP-MANAGED-ADDED-AREA-BEGINNING @persistence@--&gt;\r\n&lt;!--MP-MANAGED-ADDED-AREA-ENDING @persistence@--&gt;\r\n\r\n&lt;\/persistence&gt;\r\n<\/pre>\n<p><strong>Class annotation <\/strong><\/p>\n<pre class=\"brush:java\">@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)\r\n\/\/MP-MANAGED-ADDED-AREA-BEGINNING @class-annotation@\r\n\/\/MP-MANAGED-ADDED-AREA-ENDING @class-annotation@\r\npublic class Country {\r\n\r\n    @Hidden @Id @Column(name=\"id\" )\r\n    @GeneratedValue(strategy = GenerationType.AUTO)\r\n    private Integer id; \r\n...\r\n<\/pre>\n<p><u><strong>Generated code remark<\/strong><\/u> <\/p>\n<p>The generated code has markers inside file extension comment.<\/p>\n<p>Within MP-MANAGED-ADDED-AREA-BEGINNING and&nbsp; MP-MANAGED-ADDED-AREA-ENDING you can place customized code<br \/>\nWithin MP-MANAGED-UPDATABLE-BEGINNING-DISABLE and&nbsp; MP-MANAGED-UPDATABLE-ENDING you can alter the code. To keep your modifications please change MP-MANAGED-UPDATABLE-BEGINNING-DISABLE into MP-MANAGED-UPDATABLE-BEGINNING-ENABLE.<br \/>\nUpdatable code prevent you to lose your customisation over consecutive generations. <\/p>\n<p>For more information on updatable code see <a href=\"http:\/\/minuteproject.wikispaces.com\/Updatable_Generated_Code\">Minuteproject updatable code<\/a>.<\/p>\n<p><span style=\"font-size: x-large\">Generation<\/span><\/p>\n<ul>\n<li>Place the following file mp-config-LAZULY-OPENXAVA.xml in \/mywork\/config<\/li>\n<li>on a prompt execute mp-model-generation(.sh\/cmd) mp-config-LAZULY-OPENXAVA.xml&nbsp;<\/li>\n<li>the resulting artefacts in \/DEV\/output\/openxava\/conference&nbsp; <\/li>\n<\/ul>\n<p>To generate use the updated version of mp-config-LAZULY-OPENXAVA.xml<\/p>\n<pre class=\"brush:xml\">&lt;!DOCTYPE root&gt;\r\n&lt;generator-config&gt;\r\n &lt;configuration&gt;\r\n  &lt;conventions&gt;\r\n   &lt;target-convention type=\"enable-updatable-code-feature\" \/&gt;\r\n  &lt;\/conventions&gt;  \r\n  &lt;model name=\"conference\" version=\"1.0\" package-root=\"net.sf.mp.demo\"&gt;\r\n   &lt;data-model&gt;\r\n    &lt;driver name=\"mysql\" version=\"5.1.16\" groupId=\"mysql\" artifactId=\"mysql-connector-java\"&gt;&lt;\/driver&gt;\r\n    &lt;dataSource&gt;\r\n     &lt;driverClassName&gt;org.gjt.mm.mysql.Driver&lt;\/driverClassName&gt;\r\n     &lt;url&gt;jdbc:mysql:\/\/127.0.0.1:3306\/conference&lt;\/url&gt;\r\n     &lt;username&gt;root&lt;\/username&gt;\r\n     &lt;password&gt;mysql&lt;\/password&gt;\r\n    &lt;\/dataSource&gt;\r\n    &lt;!--\r\n     for Oracle and DB2 please set the schema &lt;schema&gt; &lt;\/schema&gt;\r\n    --&gt;\r\n    &lt;primaryKeyPolicy oneGlobal=\"true\"&gt;\r\n     &lt;primaryKeyPolicyPattern name=\"autoincrementPattern\"&gt;&lt;\/primaryKeyPolicyPattern&gt;\r\n    &lt;\/primaryKeyPolicy&gt;\r\n   &lt;\/data-model&gt;\r\n   &lt;business-model&gt;\r\n    &lt;!--\r\n     &lt;generation-condition&gt; &lt;condition type=\"exclude\"\r\n     startsWith=\"DUAL\"&gt;&lt;\/condition&gt; &lt;\/generation-condition&gt;\r\n    --&gt;\r\n    &lt;business-package default=\"conference\"&gt;\r\n        &lt;condition type=\"package\" startsWith=\"STAT\" result=\"statistics\"&gt;&lt;\/condition&gt;\r\n        &lt;condition type=\"package\" startsWith=\"COUNTRY\" result=\"admin\"&gt;&lt;\/condition&gt;\r\n        &lt;condition type=\"package\" startsWith=\"ROLE\" result=\"admin\"&gt;&lt;\/condition&gt;    \r\n    &lt;\/business-package&gt;\r\n    &lt;enrichment&gt;\r\n     &lt;conventions&gt;\r\n      &lt;column-naming-convention type=\"apply-strip-column-name-suffix\"\r\n       pattern-to-strip=\"_ID\" \/&gt;\r\n      &lt;reference-naming-convention\r\n       type=\"apply-referenced-alias-when-no-ambiguity\" is-to-plurialize=\"true\" \/&gt;\r\n     &lt;\/conventions&gt;\r\n\r\n     &lt;entity name=\"COUNTRY\" content-type=\"reference-data\"&gt;\r\n      &lt;semantic-reference&gt;\r\n       &lt;sql-path path=\"NAME\" \/&gt;\r\n      &lt;\/semantic-reference&gt;\r\n     &lt;\/entity&gt;\r\n     &lt;entity name=\"CONFERENCE_MEMBER\"&gt;\r\n      &lt;semantic-reference&gt;\r\n       &lt;sql-path path=\"FIRST_NAME\" \/&gt;\r\n       &lt;sql-path path=\"LAST_NAME\" \/&gt;\r\n      &lt;\/semantic-reference&gt;\r\n      &lt;field name=\"STATUS\"&gt;\r\n       &lt;property tag=\"checkconstraint\" alias=\"conference_member_status\"&gt;\r\n        &lt;property name=\"PENDING\" value=\"PENDING\" \/&gt;\r\n        &lt;property name=\"ACTIVE\" value=\"ACTIVE\" \/&gt;\r\n       &lt;\/property&gt;\r\n      &lt;\/field&gt;\r\n      &lt;field name=\"EMAIL\"&gt;\r\n       &lt;stereotype stereotype=\"EMAIL\" \/&gt;\r\n      &lt;\/field&gt;\r\n     &lt;\/entity&gt;\r\n     &lt;entity name=\"SPEAKER\"&gt;\r\n      &lt;field name=\"BIO\"&gt;\r\n       &lt;stereotype stereotype=\"HTML_TEXT\" \/&gt;\r\n      &lt;\/field&gt;\r\n      &lt;field name=\"PHOTO\"&gt;\r\n       &lt;stereotype stereotype=\"PHOTO\" \/&gt;\r\n      &lt;\/field&gt;\r\n      &lt;field name=\"WEB_SITE_URL\"&gt;\r\n       &lt;stereotype stereotype=\"WEBURL\" \/&gt;\r\n      &lt;\/field&gt;\r\n     &lt;\/entity&gt;\r\n     &lt;entity name=\"PRESENTATION\"&gt;\r\n      &lt;field name=\"STATUS\"&gt;\r\n       &lt;property tag=\"checkconstraint\" alias=\"presentation_status\"&gt;\r\n        &lt;property name=\"PROPOSAL\" value=\"PROPOSAL\" \/&gt;\r\n        &lt;property name=\"ACTIVE\" value=\"ACTIVE\" \/&gt;\r\n       &lt;\/property&gt;\r\n      &lt;\/field&gt;\r\n     &lt;\/entity&gt;\r\n     &lt;entity name=\"SPONSOR\"&gt;\r\n      &lt;field name=\"STATUS\"&gt;\r\n       &lt;property tag=\"checkconstraint\" alias=\"sponsor_status\"&gt;\r\n        &lt;property name=\"PENDING\" value=\"PENDING\" \/&gt;\r\n        &lt;property name=\"ACTIVE\" value=\"ACTIVE\" \/&gt;\r\n       &lt;\/property&gt;\r\n      &lt;\/field&gt;\r\n      &lt;field name=\"PRIVILEGE_TYPE\"&gt;\r\n       &lt;property tag=\"checkconstraint\" alias=\"sponsor_privilege\"&gt;\r\n        &lt;property name=\"GOLDEN\" value=\"Golden\" \/&gt;\r\n        &lt;property name=\"SILVER\" value=\"Silver\" \/&gt;\r\n        &lt;property name=\"BRONZE\" value=\"Bronze\" \/&gt;\r\n       &lt;\/property&gt;\r\n      &lt;\/field&gt;\r\n     &lt;\/entity&gt;\r\n     &lt;!-- views --&gt;\r\n     &lt;entity name=\"stat_mb_per_ctry_conf\" alias=\"MEMBER_PER_COUNTRY_AND_CONFERENCE\"&gt;\r\n      &lt;virtual-primary-key isRealPrimaryKey=\"true\"&gt;\r\n       &lt;property name=\"virtualPrimaryKey\" value=\"ID\" \/&gt;\r\n      &lt;\/virtual-primary-key&gt;\r\n     &lt;\/entity&gt;\r\n     &lt;entity name=\"stat_mb_by_role\" alias=\"MEMBER_PER_ROLE_COUNTRY_AND_CONFERENCE\"&gt;\r\n      &lt;virtual-primary-key isRealPrimaryKey=\"true\"&gt;\r\n       &lt;property name=\"virtualPrimaryKey\" value=\"id\" \/&gt;\r\n      &lt;\/virtual-primary-key&gt;\r\n      &lt;field name=\"stat_mb_per_ctry_conf_ID\" linkToTargetEntity=\"stat_mb_per_ctry_conf\"\r\n       linkToTargetField=\"id\"&gt;&lt;\/field&gt;\r\n     &lt;\/entity&gt;\r\n    &lt;\/enrichment&gt;\r\n   &lt;\/business-model&gt;\r\n  &lt;\/model&gt;\r\n  &lt;targets&gt;\r\n   &lt;!-- openxava --&gt;\r\n   &lt;target refname=\"OpenXava\" name=\"OpenXava\"\r\n    fileName=\"mp-template-config-openxava-last-features.xml\"\r\n    outputdir-root=\"..\/..\/DEV\/output\/openxava\/conference\"\r\n    templatedir-root=\"..\/..\/template\/framework\/openxava\"&gt;\r\n   &lt;\/target&gt;\r\n\r\n   &lt;target refname=\"JPA2-LIB\" fileName=\"mp-template-config-JPA2-LIB.xml\"\r\n    templatedir-root=\"..\/..\/template\/framework\/jpa\"&gt;\r\n   &lt;\/target&gt;\r\n   \r\n   &lt;target refname=\"BSLA-LIB\" fileName=\"mp-template-config-bsla-LIB-features.xml\"\r\n    templatedir-root=\"..\/..\/template\/framework\/bsla\"&gt;\r\n   &lt;\/target&gt;\r\n\r\n   &lt;target refname=\"CACHE-LIB\" \r\n      fileName=\"mp-template-config-CACHE-LIB.xml\" \r\n      templatedir-root=\"..\/..\/template\/framework\/cache\"&gt;\r\n   &lt;\/target&gt;\r\n               \r\n  &lt;\/targets&gt;\r\n &lt;\/configuration&gt;\r\n&lt;\/generator-config&gt;\r\n<\/pre>\n<p><span style=\"font-size: x-large\">Test<\/span><br \/>\nTo ensure that the caching is working properly:<\/p>\n<ul>\n<li>Enable hibernate logging. Add the following snippet as extra properties in persistence.xml.<\/li>\n<\/ul>\n<pre class=\"brush:xml\">&lt;property name=\"hibernate.show_sql\" value=\"true\" \/&gt;\r\n            &lt;property name=\"hibernate.format_sql\" value=\"true\" \/&gt;\r\n<\/pre>\n<ul>\n<li>navigate to an entity that reference country (example Address)<\/li>\n<li>When you view the detail of this entity you will notice that there is a load of the associated entity &#8216;country&#8217;<\/li>\n<li>But the second time you access to the details of this entity (or another entity referencing the same country instance), the country is not loaded twice from the database.<\/li>\n<\/ul>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/minuteproject.blogspot.com\/2011\/12\/adding-ehcache-to-openxava-application.html\">Adding Ehcache to Openxava application<\/a>&nbsp;from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a><span class=\"Apple-style-span\" style=\"font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif\"><span class=\"Apple-style-span\" style=\"font-size: 14px;line-height: 18px\"><strong>&nbsp;<\/strong><\/span><\/span>Florian Adler at the&nbsp;<a href=\"http:\/\/minuteproject.blogspot.com\/\">minuteproject blog<\/a>. <\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its graph, relationships are loaded. Adding a&nbsp;second-level cache fasten the retrieval of associated elements, since already loaded elements are retrieved from cache and not database. Eventually this page explains how minuteproject treats this aspect &hellip;<\/p>\n","protected":false},"author":166,"featured_media":202,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[412,346],"class_list":["post-1024","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-openxava","tag-terracotta-ehcache"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Adding Ehcache to Openxava application - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its\" \/>\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\/2012\/03\/adding-ehcache-to-openxava-application.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adding Ehcache to Openxava application - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.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:published_time\" content=\"2012-03-08T16:02:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T23:18:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/openxava-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=\"Florian Adler\" \/>\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=\"Florian Adler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html\"},\"author\":{\"name\":\"Florian Adler\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/0f7b3a3649f19c4e475c805c26e5b182\"},\"headline\":\"Adding Ehcache to Openxava application\",\"datePublished\":\"2012-03-08T16:02:00+00:00\",\"dateModified\":\"2012-10-21T23:18:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html\"},\"wordCount\":597,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/openxava-logo.jpg\",\"keywords\":[\"OpenXava\",\"Terracotta Ehcache\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html\",\"name\":\"Adding Ehcache to Openxava application - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/openxava-logo.jpg\",\"datePublished\":\"2012-03-08T16:02:00+00:00\",\"dateModified\":\"2012-10-21T23:18:50+00:00\",\"description\":\"Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/openxava-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/openxava-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/adding-ehcache-to-openxava-application.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\":\"Adding Ehcache to Openxava application\"}]},{\"@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\\\/0f7b3a3649f19c4e475c805c26e5b182\",\"name\":\"Florian Adler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9fe405eed85b19c5ce73073d6f577d10e709c86b4e9cc3e0967004a8c94a05b2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9fe405eed85b19c5ce73073d6f577d10e709c86b4e9cc3e0967004a8c94a05b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9fe405eed85b19c5ce73073d6f577d10e709c86b4e9cc3e0967004a8c94a05b2?s=96&d=mm&r=g\",\"caption\":\"Florian Adler\"},\"sameAs\":[\"http:\\\/\\\/minuteproject.blogspot.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Florian-Adler\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Adding Ehcache to Openxava application - Java Code Geeks","description":"Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its","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\/2012\/03\/adding-ehcache-to-openxava-application.html","og_locale":"en_US","og_type":"article","og_title":"Adding Ehcache to Openxava application - Java Code Geeks","og_description":"Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its","og_url":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-03-08T16:02:00+00:00","article_modified_time":"2012-10-21T23:18:50+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/openxava-logo.jpg","type":"image\/jpeg"}],"author":"Florian Adler","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Florian Adler","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html"},"author":{"name":"Florian Adler","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/0f7b3a3649f19c4e475c805c26e5b182"},"headline":"Adding Ehcache to Openxava application","datePublished":"2012-03-08T16:02:00+00:00","dateModified":"2012-10-21T23:18:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html"},"wordCount":597,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/openxava-logo.jpg","keywords":["OpenXava","Terracotta Ehcache"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html","url":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html","name":"Adding Ehcache to Openxava application - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/openxava-logo.jpg","datePublished":"2012-03-08T16:02:00+00:00","dateModified":"2012-10-21T23:18:50+00:00","description":"Introduction This article shows how to quickly enable Ehcache on Openxava applications and thus improving performance. When viewing an entity and its","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/openxava-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/openxava-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/adding-ehcache-to-openxava-application.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":"Adding Ehcache to Openxava application"}]},{"@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\/0f7b3a3649f19c4e475c805c26e5b182","name":"Florian Adler","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/9fe405eed85b19c5ce73073d6f577d10e709c86b4e9cc3e0967004a8c94a05b2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9fe405eed85b19c5ce73073d6f577d10e709c86b4e9cc3e0967004a8c94a05b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9fe405eed85b19c5ce73073d6f577d10e709c86b4e9cc3e0967004a8c94a05b2?s=96&d=mm&r=g","caption":"Florian Adler"},"sameAs":["http:\/\/minuteproject.blogspot.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Florian-Adler"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1024","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\/166"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1024"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1024\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/202"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}