最近学习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&lt;Record&gt; 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....