Easy Tricks for JPA, Spring and Hibernate
Join the DZone community and get the full member experience.
Join For FreeJava frameworks have evolved, making us write less code and ship faster! Here, I will discuss some neat tricks to address common concerns in Hibernate and Spring.
1. Auto Scan JPA entities. This is an old trick!
Listing entities (via <class> element) in persistence.xml isn't needed any more. You may drop it all together and use Spring's packagesToScan feature. Sample spring configuration below.
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="HelloService" /> <property name="packagesToScan" value="com.x.y.z" /> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> </bean> </property> </bean>
2.Entities often have audit columns like the following:
@Column(name = "created_by", updatable = false) protected String createdBy; @Column(name = "creation_date", updatable = false) protected Date createdOn; @Column(name = "last_updated_by") protected String lastUpdatedBy; @Column(name = "last_updated") protected Date lastUpdatedOn;
And providing those values require either writing pre-insert/update Hibernate listeners or writing setters. How about sprinkling some annotations to get the job done? I mean ...
@Column(name = "created_by", updatable = false) @ModifiedBy protected String createdBy; @Column(name = "creation_date", updatable = false) @CreationTimestamp protected Date createdOn; @Column(name = "last_updated_by") @ModifiedBy protected String lastUpdatedBy; @Column(name = "last_updated") @UpdateTimestamp protected Date lastUpdatedOn;
It is quite simple. Read this:http://docs.jboss.org/hibernate/orm/4.3/topical/html/generated/GeneratedValues.html
3. Applications are deployed in different environments and configuring those are often messy and by messy I mean repetitive. Spring property place holder has a neat trick by using property of property to dynamically create the property key for each environment.
Sample common properties file for all environments.
# ec2.properties is a properties for all environment. awsAccountId=${${env}.awsAccountId} availabilityZone=${${env}.availabilityZone} keyName=${${env}.dev} expiry=${${env}.expiry} instanceType=${${env}.instanceType} dev.awsAccountId = 11111111111 dev.availabilityZone = us-east-1a dev.keyName = dev dev.expiry = 360000 dev.instanceType = m1.small beta.awsAccountId = 222222222222 beta.availabilityZone = us-east-1a beta.keyName = beta beta.expiry = 360000 beta.instanceType = m1.large
Here is how you will use this file in spring context configuration -
<bean id="ec2Settings" class="x.y.z.EC2Settings"> <property name="accountId" value="${awsAccountId}" /> <property name="zone" value="${availabilityZone}" /> <property name="key" value="${keyName}" /> <property name="expiry" value="${expiry}" /> <property name="instanceType" value="${instanceType}" /> </bean>
Published at DZone with permission of Nishant Chandra, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments