Java 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.html3. 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>