Skip to content
Calvin edited this page Sep 2, 2012 · 29 revisions

1.Spring Data JPA

Spring Data JPA在JPA上又做了一层封装,只要编写接口就够了,不用写一行实现代码,CRUD方法啦,分页啦,自动将findByLoginName()的方法定义翻译成适当的QL啦都由它包了:

	public interface UserDao extends PagingAndSortingRepository<User, Long> {
		User findByLoginName(String loginName);
	}

使用上很简单,快速浏览一下下面的资料就够了。

只有一个坑爹的地方,如果要为UserDao扩展方法(而不是接口),要新增一个UserDaoCustom接口,这时候,实现类的名字必须是UserDaoImpl,而不是UserDaoCustomImpl。

另外,除了智能地翻译连Less,Not,And,Or都支持的方法名,它当然也可以直接用@Query在方法上标注复杂的查询语句。

###资料

2.JPA

2.1 NamingStrategy

数据库的表名,列名与Entity对应的规则,最常见的一个需求是把LOGIN_NAME翻译成loginName,Hibernate提供了ImprovedNamingStrategy, 在JPA中可以这样设置:

	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
			</props>
		</property>
	</bean>

2.2 测试

测试所有Mapping的Case

在quickstart里有一个JpaMappingTest,会遍历所有Entity,执行一次select操作看entity上的JPA annotation有没有问题,必备

flush

hibernate很智能的,事务未提交前都不会轻易执行sql,为了让它执行,需要在测试用例里注入一个EntityManager

	@PersistenceContext
	private EntityManager em;

然后在每个save操作后面,跟一句em.flush();

2.3 SpringSide Modules

暂时的Jpas里只有一个initLazyProperty(Object proxyed), 强制初始化对象的某个lazy load属性。

2.4 Tips

@NamedQuery?

在Entity的开头以@NamedQuery标注用到的sql,好处是JPA的实现会缓存这些JQL的编译结果,坏处就是在本来干净的Entity写满了JQL,而且那个name是一个字符串,不容易在IDE里快速定位到具体的语句。

所以还是用静态变量在DAO里定义JQL算了。

##3. Hibernate ###Ehcache配置的更新 原来的Provider写法

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>

hibernate3.3后换成

<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="net.sf.ehcache.configurationResourceName">ehcache/ehcache-hibernate-local.xml</prop>

##4. Log4jdbc 如果要想看到实际执行的sql和实际绑定的参数,可以使用log4jdbc,而hibernate自己的showsql看不到绑定的参数。 打开application.properties里jdbc driver换成log4jdbc的Driver,并在原来的jdbc url的中间加上log4jdbc

jdbc.driver=net.sf.log4jdbc.DriverSpy
jdbc.url=jdbc:log4jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE

然后在log4j.properties里定义log4jdbc的级别是info就行了。这里有两种选择:

#sql and execute time
log4j.logger.jdbc.sqltiming=INFO
#sql only
log4j.logger.jdbc.sqlonly=INFO

返回参考手册