最近学习datanucleus ,datanucleus和Hibernate一样,都是操作数据库的持久层。本人之前一直使用的是SSH框架,这次尝试把Hibernate换成datanucleus,成功。
(1)首先 上maven的pom.xml
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.1.2.RELEASE</version>
</dependency> -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<!-- hibernate -->
<!-- <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.2.Final</version>
</dependency> -->
<!-- struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.16</version>
<!-- 这里的 exclusions 是排除包,因为 Struts2中有javassist,Hibernate中也有javassist,
所以如果要整合Hibernate,一定要排除掉Struts2中的javassist,否则就冲突了。-->
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用了这个插件之后,就可以采用注解的方式配置Struts的Action,免去了在struts.xml中的繁琐配置项 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.20</version>
</dependency>
<!--config-browser-plugin插件,使用了这个插件之后,就可以很方便的浏览项目中的所有action及其与 jsp view的映射 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-config-browser-plugin</artifactId>
<version>2.3.20</version>
</dependency>
<!-- Struts2和Spring整合插件 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.3.8</version>
</dependency>
<!--Druid连接池包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.12</version>
</dependency>
<!-- MariaDB 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.20</version>
</dependency>
<!--aspectjweaver包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.0-GA</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
<version>3.0.1</version>
</dependency>
<!-- datanucleus -->
<dependency>
<groupId>javax.jdo</groupId>
<artifactId>jdo-api</artifactId>
<version>3.1</version>
</dependency>
<!-- 下面为DataNucleus所需jar包 -->
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>4.1.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-enhancer</artifactId>
<version>3.1.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jdo</artifactId>
<version>4.1.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-jdo-query</artifactId>
<version>4.2.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-cache</artifactId>
<version>3.0.0-m2</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-rdbms</artifactId>
<version>4.1.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-management</artifactId>
<version>1.0.2</version>
</dependency>
<!-- spring-test junit -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>
在maven中,去除了Hibernate的依赖jar包 包含了Struts Spring datanucleus jdo junit
2. 同写SSH框架一样,写Action DAO层 代码如下
package com.chi.dao;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Transaction;
import javax.jdo.Query;
import com.chi.film.Movie;
import com.chi.util.JDOConfiguration;
public class SearchMovieDaoImpl implements SearchMovieDao {
private JDOConfiguration jDOConfiguration;
public JDOConfiguration getjDOConfiguration() {
return jDOConfiguration;
public void setjDOConfiguration(JDOConfiguration jDOConfiguration) {
this.jDOConfiguration = jDOConfiguration;
@Override
public List<Movie> searchAll() {
// 查询不开启事务
PersistenceManagerFactory pmf = jDOConfiguration.persistenceManagerFactory();
PersistenceManager pm = pmf.getPersistenceManager();
List<Movie> list = null;
try {
Query q=pm.newQuery("SELECT FROM " + Movie.class.getName());
//Query q=pm.newQuery("SELECT FROM " + Movie.class.getName() + " where id == 2 " );
//datanucleus 中使用 "=="
list = (List<Movie>)q.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
pm.close();
pmf.close();
return list;
public boolean minusNumber(){
PersistenceManagerFactory pmf = jDOConfiguration.persistenceManagerFactory();
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Movie movie = pm.getObjectById(Movie.class, 2);
movie.setMovieNumber(movie.getMovieNumber()+1);
pm.makePersistent(movie);
tx.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally{
if(tx.isActive()) tx.rollback();
pm.close();
pmf.close();
}
仅展示DAO层代码。此处重点说明,在datanucleus的官网的例子中,并没有update功能的实现。百度、CSDN找了半天都没有提到这个。最后在stackoverflow上找到答案
附上链接: http://stackoverflow.com/questions/3604722/how-to-use-jdodatanucleus-to-update-delete-data
3.Spring的配置文件
此处Spring的用途只是管理bean文件,代码如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 依赖注入我们需要的Entity、Dao、Service -->
<bean id="movie" class="com.chi.film.Movie"></bean>
<bean id="jDOConfiguration" class="com.chi.util.JDOConfiguration"></bean>
<bean id="searchMovieDao" class="com.chi.dao.SearchMovieDaoImpl">
<property name="jDOConfiguration">
<ref bean="jDOConfiguration" />
</property>
</bean>
<bean id="searchMovieService" class="com.chi.service.SearchMovieServiceImpl">
<property name="searchMovieDao">
<ref bean="searchMovieDao" />
</property>
</bean>
<bean id="searchMovieAction" class="com.chi.action.SearchMovieAction">
<property name="searchMovieService">
<ref bean="searchMovieService" />
</property>
</bean>
</beans>
至此,整个datanucleus+spring+struts构建完成
4. Junit测试
package com.chi.test;
import javax.annotation.Resource;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.chi.service.SearchMovieService;
import com.chi.util.JDOConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class JDOTest {
@Resource
private JDOConfiguration jDOConfiguration;
public JDOConfiguration getjDOConfiguration() {
return jDOConfiguration;
public void setjDOConfiguration(JDOConfiguration jDOConfiguration) {
this.jDOConfiguration = jDOConfiguration;
@Resource
private SearchMovieService searchMovieService;
public SearchMovieService getSearchMovieService() {
return searchMovieService;
public void setSearchMovieService(SearchMovieService searchMovieService) {
this.searchMovieService = searchMovieService;
@Test
public void testUpdate(){
Assert.assertEquals(true, searchMovieService.minusNumber());
/* @Test
public void testSave(){
PersistenceManagerFactory pmf = jDOConfiguration.persistenceManagerFactory();
PersistenceManager pm = pmf.getPersistenceManager();
try {
Query q=pm.newQuery("SELECT FROM " + Movie.class.getName() + " where id == 2 " );
List<Movie> list = (List<Movie>)q.execute();
System.out.println(list.size());
} catch (Exception e) {
e.printStackTrace();
}finally{
pm.close();
pmf.close();
成功的在功夫熊猫的MovieNumber增加1
5. 页面效果展示
6.注意 datanucleus中的类是纯pojo,必须在属性上方加上注释,如下图
package com.chi.film;
import javax.jdo.annotations.Column;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.PrimaryKey;
* Movie entity. @author MyEclipse Persistence Tools
@PersistenceCapable(table = "MOVIE")
public class Movie implements java.io.Serializable {
// Fields
@PrimaryKey
@Column(name="Id")
private Integer id;
@Column(name="MovieName")
private String movieName;
@Column(name ="MovieNumber")
private Integer movieNumber;
// Constructors
/** default constructor */
public Movie() {
/** full constructor */
public Movie(Integer id, String movieName, Integer movieNumber) {
this.id = id;
this.movieName = movieName;
this.movieNumber = movieNumber;
// Property accessors
public Integer getId() {
return this.id;
public void setId(Integer id) {
this.id = id;
public String getMovieName() {
return this.movieName;
public void setMovieName(String movieName) {
this.movieName = movieName;
public Integer getMovieNumber() {
return this.movieNumber;
public void setMovieNumber(Integer movieNumber) {
this.movieNumber = movieNumber;
@Override
public String toString() {
return "Movie [id=" + id + ", movieName=" + movieName
+ ", movieNumber=" + movieNumber + "]";
}
最后,struts.xml 和web.xml配置基本不变,需要出去hibernate部分。
详情可以见我的代码。
最近学习datanucleus ,datanucleus和Hibernate一样,都是操作数据库的持久层。本人之前一直使用的是SSH框架,这次尝试把Hibernate换成datanucleus,成功。(1)首先 上maven的pom.xml junit junit 4.10 test
开发应用程序通常是一项复杂的任务,涉及许多组件。 开发所有这些组件可能非常耗时。 Java 数据对象 API (JDO) 旨在减少花费的一些时间,提供一个 API 以允许 Java 开发人员将面向对象的数据持久化到任何数据库中,并提供一种使用与开发人员相同的 Java 语法的查询语言。
DataNucleus JDO 提供了此 JDO 标准的实现,允许您(用户)将面向对象的数据持久保存到该标准的 RDBMS 数据存储中,而且还保存到范围广泛的其他数据存储中。 其中包括流行的map存储,例如 Cassandr
public List<Record> listAllRecord() {
PersistenceManager pm = getPersistenceManager();
// Transaction tx= pm.cur...
在Spring中使用JDO前言 在此前的Spring: A Developer's
Notebook摘录中,作者Bruce Tate和Justin Gehtland讨论了在Spring中使用iBATIS
OR持久化框架的内...
在排查hivemetastore 时,对它详细了解,看到用到Datanucleus,对它也进行了解,详细了解这个方面应用,看到下面官网资料比较详细。希望测底研究的朋友,进行详细了解。
JDO : Caching
Caching is an essential mechanism in providing efficient usage of resources in many systems....