在上篇《Spring 使用内存数据库》中我们使用Hibernate作为ORM的框架,直接调用Hibernate的API进行相关的持久化操作,但在实际项目中,可能会由于公司规定等原因要求统一使用JPA接口来进行持久化,而JPA的实现可以灵活配置,避免对第三方JPA实现的过分依赖,这样可能会牺牲第三方JPA实现带来的一些额外优化和特性,但确实避免了对其依赖,本文将更改《Spring 使用内存数据库》Demo的实现,使其使用JPA标准接口进行持久化操作,而JPA实现可以配置为Hibernate或EclipseLink支持。
第一步:将HibernateConfiguration类修改为JpaConfiguration类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
@Configuration public class JpaConfiguration {
@Autowired
private DataSource dataSource;
@Bean
public Map<String, Object> jpaProperties() {
Map<String, Object> props = new HashMap<String, Object>();
//Hibernate JPA properties
/*props.put("hibernate.dialect", H2Dialect.class.getName());
props.put("hibernate.cache.provider_class", HashtableCacheProvider.class.getName());*/
//EclipseLink JPA properties
props.put("eclipselink.weaving", "false");
return props;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
//Hibernate JPA Vendor Adapter
/*AbstractJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();*/
//EclipseLink JPA Vendor Adapter
AbstractJpaVendorAdapter jpaVendorAdapter = new EclipseLinkJpaVendorAdapter();
//Common vendor settings
jpaVendorAdapter.setShowSql(false);
jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setDatabase(Database.H2);//指定数据库为 H2
return jpaVendorAdapter;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager( localContainerEntityManagerFactoryBean().getObject() );
}
@Bean
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean() {
LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
lef.setDataSource(this.dataSource);
lef.setJpaPropertyMap(this.jpaProperties());
lef.setJpaVendorAdapter(this.jpaVendorAdapter());
return lef;
}
/**
* 设置数据源,可以指定类型为Derby或HSQLDB
* @return
*/
@Bean
public DataSource dataSource(){
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
builder.setType(EmbeddedDatabaseType.H2);
return builder.build();
}
} |
第二步:修改OrderPersistenceTests类
将org.hibernate.Session类的API操作修改为javax.persistence.EntityManager类的API
org.hibernate.Session类的API代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
|
@Autowired private SessionFactory sessionFactory;
@Test
@Transactional
public void testSaveOrderWithItems() throws Exception {
Session session = sessionFactory.getCurrentSession();
Order order = new Order();
order.getItems().add( new Item());
session.save(order);
session.flush();
assertNotNull(order.getId());
}
|
javax.persistence.EntityManager类的API代码示例:
1
2
3
4
5
6
7
8
9
10
11
|
@PersistenceContext private EntityManager entityManager;
@Test
@Transactional
public void testSaveOrderWithItems() throws Exception {
Order order = new Order();
order.getItems().add( new Item());
entityManager.persist(order);
entityManager.flush();
assertNotNull(order.getId());
}
|
第三步:修改Maven依赖,可以参考附件。
修改完成,可以开始运行测试用例进行调试!总感觉EclipseLink是个半成品,不是很好使,甲骨文公司还是希望Everybody使用TopLink!
附件:http://down.51cto.com/data/2363913
本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1343969,如需转载请自行联系原作者