Spring使用内存数据库二

在上篇《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,如需转载请自行联系原作者



上一篇:这只“盒子”也上云了!一个半月快速、低成本上云,云数据库专属集群解决方案看过来


下一篇:一步一步了解Cocos2dx 3.0 RC版本开发环境搭建(Win32/Android)