有時候為了做些測試需要建立資料庫及相關表,安裝MySQL等輕量資料庫雖然簡單但還是有點麻煩?而且用于自己臨時測試的資料庫對象一般不會被多次使用,還是浪費?記憶體資料庫結合ORM可以很好解決這個問題。
H2,Derby,HSQLDB 都是很好的記憶體資料庫,大家可以根據自己的需要選擇:
<a href="http://www.h2database.com/html/main.html" target="_blank">H2</a>
<a href="http://db.apache.org/derby" target="_blank">Derby</a>
<a href="http://hsqldb.org/" target="_blank">HSQLDB</a>
<a href="http://mysql.com/" target="_blank">MySQL</a>
Pure Java
Yes
No
Memory Mode
Encrypted Database
ODBC Driver
Fulltext Search
Multi Version Concurrency
Footprint (jar/dll size)
~1 MB
~2 MB
~4 MB
~6 MB
Spring已經對使用記憶體資料庫提供很完美的支援:
配置類:
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
<code>@Configuration</code>
<code>public</code> <code>class</code> <code>HibernateConfiguration {</code>
<code> </code><code>@Autowired</code>
<code> </code><code>private</code> <code>DataSource dataSource;</code>
<code> </code><code>@Bean</code>
<code> </code><code>public</code> <code>AnnotationSessionFactoryBean sessionFactoryBean() {</code>
<code> </code><code>Properties props = </code><code>new</code> <code>Properties();</code>
<code> </code><code>//配置H2方言</code>
<code> </code><code>props.put(</code><code>"hibernate.dialect"</code><code>, H2Dialect.</code><code>class</code><code>.getName());</code>
<code> </code><code>props.put(</code><code>"hibernate.format_sql"</code><code>, </code><code>"true"</code><code>);</code>
<code> </code><code>AnnotationSessionFactoryBean bean = </code><code>new</code> <code>AnnotationSessionFactoryBean();</code>
<code> </code><code>bean.setAnnotatedClasses(</code><code>new</code> <code>Class[]{Item.</code><code>class</code><code>, Order.</code><code>class</code><code>});</code>
<code> </code><code>bean.setHibernateProperties(props);</code>
<code> </code><code>bean.setDataSource(</code><code>this</code><code>.dataSource);</code>
<code> </code><code>bean.setSchemaUpdate(</code><code>true</code><code>);</code>
<code> </code><code>return</code> <code>bean;</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>HibernateTransactionManager transactionManager() {</code>
<code> </code><code>return</code> <code>new</code> <code>HibernateTransactionManager( sessionFactoryBean().getObject() );</code>
<code> </code>
<code> </code><code>/**</code>
<code> </code><code>* 設定記憶體資料庫類型,可以更改為Derby,HSQL</code>
<code> </code><code>* @return</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>DataSource dataSource(){</code>
<code> </code><code>EmbeddedDatabaseBuilder builder = </code><code>new</code> <code>EmbeddedDatabaseBuilder();</code>
<code> </code><code>builder.setType(EmbeddedDatabaseType.H2);</code>
<code> </code><code>return</code> <code>builder.build();</code>
<code>}</code>
然後我們可以寫entity類及相關測試用例:
Order Entity類:
34
35
36
37
38
39
40
41
42
43
44
45
<code>@Entity</code>
<code>@Table</code><code>(name=</code><code>"T_ORDER"</code><code>)</code>
<code>public</code> <code>class</code> <code>Order {</code>
<code> </code>
<code> </code><code>@Id</code>
<code> </code><code>@GeneratedValue</code><code>(strategy=GenerationType.AUTO)</code>
<code> </code><code>private</code> <code>Long id;</code>
<code> </code><code>private</code> <code>String customer;</code>
<code> </code><code>@OneToMany</code><code>(cascade=CascadeType.ALL)</code>
<code> </code><code>@JoinColumn</code><code>(name=</code><code>"ORDER_ID"</code><code>)</code>
<code> </code><code>private</code> <code>Collection<Item> items = </code><code>new</code> <code>LinkedHashSet<Item>();</code>
<code> </code><code>* @return the customer</code>
<code> </code><code>public</code> <code>String getCustomer() {</code>
<code> </code><code>return</code> <code>customer;</code>
<code> </code><code>* @param customer the customer to set</code>
<code> </code><code>public</code> <code>void</code> <code>setCustomer(String customer) {</code>
<code> </code><code>this</code><code>.customer = customer;</code>
<code> </code><code>* @return the items</code>
<code> </code><code>public</code> <code>Collection<Item> getItems() {</code>
<code> </code><code>return</code> <code>items;</code>
<code> </code><code>* @param items the items to set</code>
<code> </code><code>public</code> <code>void</code> <code>setItems(Collection<Item> items) {</code>
<code> </code><code>this</code><code>.items = items;</code>
<code> </code><code>* @return the id</code>
<code> </code><code>public</code> <code>Long getId() {</code>
<code> </code><code>return</code> <code>id;</code>
Item Entity類
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<code>public</code> <code>class</code> <code>Item {</code>
<code> </code><code>@GeneratedValue</code><code>(strategy = GenerationType.AUTO)</code>
<code> </code><code>@ManyToOne</code>
<code> </code><code>private</code> <code>Order order;</code>
<code> </code><code>private</code> <code>String product;</code>
<code> </code><code>private</code> <code>double</code> <code>price;</code>
<code> </code><code>private</code> <code>int</code> <code>quantity;</code>
<code> </code><code>* @return the order</code>
<code> </code><code>public</code> <code>Order getOrder() {</code>
<code> </code><code>return</code> <code>order;</code>
<code> </code><code>* @return the product</code>
<code> </code><code>public</code> <code>String getProduct() {</code>
<code> </code><code>return</code> <code>product;</code>
<code> </code><code>* @param product</code>
<code> </code><code>* the product to set</code>
<code> </code><code>public</code> <code>void</code> <code>setProduct(String product) {</code>
<code> </code><code>this</code><code>.product = product;</code>
<code> </code><code>* @return the price</code>
<code> </code><code>public</code> <code>double</code> <code>getPrice() {</code>
<code> </code><code>return</code> <code>price;</code>
<code> </code><code>* @param price</code>
<code> </code><code>* the price to set</code>
<code> </code><code>public</code> <code>void</code> <code>setPrice(</code><code>double</code> <code>price) {</code>
<code> </code><code>this</code><code>.price = price;</code>
<code> </code><code>* @return the quantity</code>
<code> </code><code>public</code> <code>int</code> <code>getQuantity() {</code>
<code> </code><code>return</code> <code>quantity;</code>
<code> </code><code>* @param quantity</code>
<code> </code><code>* the quantity to set</code>
<code> </code><code>public</code> <code>void</code> <code>setQuantity(</code><code>int</code> <code>quantity) {</code>
<code> </code><code>this</code><code>.quantity = quantity;</code>
Junit測試類
<code>@ContextConfiguration</code>
<code>@RunWith</code><code>(SpringJUnit4ClassRunner.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>OrderPersistenceTests {</code>
<code> </code><code>private</code> <code>SessionFactory sessionFactory;</code>
<code> </code><code>@Test</code>
<code> </code><code>@Transactional</code>
<code> </code><code>public</code> <code>void</code> <code>testSaveOrderWithItems() </code><code>throws</code> <code>Exception {</code>
<code> </code><code>Session session = sessionFactory.getCurrentSession();</code>
<code> </code><code>Order order = </code><code>new</code> <code>Order();</code>
<code> </code><code>order.getItems().add(</code><code>new</code> <code>Item());</code>
<code> </code><code>session.save(order);</code>
<code> </code><code>session.flush();</code>
<code> </code><code>assertNotNull(order.getId());</code>
<code> </code><code>public</code> <code>void</code> <code>testSaveAndGet() </code><code>throws</code> <code>Exception {</code>
<code> </code><code>// Otherwise the query returns the existing order (and we didn't set the</code>
<code> </code><code>// parent in the item)...</code>
<code> </code><code>session.clear();</code>
<code> </code><code>Order other = (Order) session.get(Order.</code><code>class</code><code>, order.getId());</code>
<code> </code><code>assertEquals(</code><code>1</code><code>, other.getItems().size());</code>
<code> </code><code>assertEquals(other, other.getItems().iterator().next().getOrder());</code>
<code> </code><code>public</code> <code>void</code> <code>testSaveAndFind() </code><code>throws</code> <code>Exception {</code>
<code> </code><code>Item item = </code><code>new</code> <code>Item();</code>
<code> </code><code>item.setProduct(</code><code>"foo"</code><code>);</code>
<code> </code><code>order.getItems().add(item);</code>
<code> </code><code>Order other = (Order) session</code>
<code> </code><code>.createQuery( </code><code>"select o from Order o join o.items i where i.product=:product"</code><code>)</code>
<code> </code><code>.setString(</code><code>"product"</code><code>, </code><code>"foo"</code><code>).uniqueResult();</code>
整個項目已經打包,大家可以詳閱,也可以直接參考Spring的示例項目,基本一樣。
<a href="http://down.51cto.com/data/2363898" target="_blank">附件:http://down.51cto.com/data/2363898</a>
本文轉自sarchitect 51CTO部落格,原文連結:http://blog.51cto.com/stevex/1343060,如需轉載請自行聯系原作者