JDO(Java Data Object )是Java对象持久化的新的规范。也是一个用于存取某种数据仓库中的对象的标准化API。

注意JDO是一种规范,而不是一个产品。而DataNucleus正是实现JDO规范的产品之中的一个。JDO实现产品还有FOStore、JPOX等。当然DataNucleus不仅实现了JDO规范,还实现了JPA(java还有一持久化规范),也就是说有了DataNucleus,你既能够选择JDO
API,也能够选择JPA API进行持久化操作。



    如今DataNucleus官网上主要推的是3.3与4.0版本号。3.3版本号须要JDK1.6以上。而4.0版本号须要JDK1.7以后,因为本人寻常习惯于JDK1.6,所以在这里选择的是DataNucleus3.0版本号。

要使用DataNucleus,必需要加入其jar包。由于其jar包比較多还涉及jar包依赖关系,所以最好是使用maven进行构建。以下是项目依赖:

<!-- JDO API -->
<dependency>
<groupId>javax.jdo</groupId>
<artifactId>jdo-api</artifactId>
<version>3.1-rc1</version>
</dependency>
<!-- mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<!-- 以下为DataNucleus所需jar包 -->
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-enhancer</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jdo</artifactId>
<version>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-jdo-query</artifactId>
<version>3.0.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>3.0.0-m4</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-management</artifactId>
<version>1.0.2</version>
</dependency>

有了jar包后,就应该写配置文件了。

在类路径下新建一个 META-INF/persistence.xml文件。文件名必须为persistence.xml且必须放在META-INF文件夹中,这是JDO规范中规定死的。以下是该配置文件内容:

<?

xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <!-- 一个配置文件里能够有多个持久化单元(persistence-unit) RESOURCE_LOCAL表示本地事务 -->
<persistence-unit name="xtayfjpk" transaction-type="RESOURCE_LOCAL">
<-- 包括一个Person实体 -->
<class>com.xtayfjpk.jdo.entity.Person</class>
<exclude-unlisted-classes/>
<properties>
<property name="datanucleus.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="datanucleus.ConnectionURL" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="datanucleus.ConnectionUserName" value="root"/>
<property name="datanucleus.ConnectionPassword" value="******"/>
<property name="datanucleus.autoCreateSchema" value="true"/>
</properties>
</persistence-unit>
</persistence>

properties中主要设置的是数据库连接信息。该连接信息还有还有一种写法:

<property name="javax.jdo.option.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="javax.jdo.option.ConnectionURL" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="javax.jdo.option.ConnectionUserName" value="root"/>
<property name="javax.jdo.option.ConnectionPassword" value="******"/>

javax.jdo.option.ConnectionDriverName是datanucleus.ConnectionDriverName的别名。其他依此类推,datanucleus.autoCreateSchema=true表示在操作JDO API的时候相应的数据库表还没有创建的话会依据实体的元数据自己主动创建表。

当然能够设置的属性还有非常多,详细请參看:http://www.datanucleus.org/products/accessplatform_3_3/persistence_properties.html。



以下是Person类代码:

package com.xtayfjpk.jdo.entity;

import javax.jdo.annotations.Column;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.PrimaryKey; @PersistenceCapable(table="JDO_PERSON")
public class Person {
@PrimaryKey
@Column(name="P_ID")
//假设ID要自增长请加上@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
private Integer id; @Column(name="P_NAME")
private String name; @Column(name="P_AGE")
private int age; @Column(name="P_EMAIL")
private String email; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", email=" + email + "]";
}
}

配置元数据即能够既使用XML配置文件,也能够使用注解,但个人习惯使用注解。要使一个类能够被JDO操作,必须在类上加上@PersistenceCapable注解,其table属性用于设置该实体相应的数据库表名称。

@PrimaryKey用于表示这是主键,@Column(name="P_AGE")用于指定表字段名称。@Column不是必须的。这些注解就可以放置在字段上,也能够放置在相应的getter方法上.JDO提供的注解有非常多,有些注解还有非常多属性,详细请參看:http://db.apache.org/jdo/annotations.html。



配置好了元数据后就能够操作JDO的API了。例如以下:

package com.xtayfjpk.jdo;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Transaction; import org.junit.Before;
import org.junit.Test; import com.xtayfjpk.jdo.entity.Person; /**
* Unit test for JDO.
*/ public class JDOTest {
private static PersistenceManagerFactory pmf = null; @Before
public void before() {
/*Properties properties = new Properties();
properties.setProperty("javax.jdo.option.ConnectionDriverName","com.mysql.jdbc.Driver");
properties.setProperty("javax.jdo.option.ConnectionURL","jdbc:mysql://127.0.0.1:3306/test");
properties.setProperty("javax.jdo.option.ConnectionUserName","root");
properties.setProperty("javax.jdo.option.ConnectionPassword","xtayfjpk");
properties.setProperty("javax.jdo.option.Optimistic","true");
properties.setProperty("datanucleus.autoCreateSchema","true");*/
//getPersistenceManagerFactory有非常多重载的方法,详细请參看API
pmf = JDOHelper.getPersistenceManagerFactory("xtayfjpk");
} @Test
public void testPersistenceManageFactory() {
System.out.println(pmf);
} @Test
public void testSave() {
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Person person = new Person();
person.setId(1);
person.setName("王五");
person.setAge(40);
person.setEmail("wangwu@qq.com");
Person p = pm.makePersistent(person);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx.isActive()) {
tx.rollback();
}
} finally {
pm.close();
pmf.close();
}
} }

有一点特别须要注解的是:尽管上面在写Person类的时候就是一个纯POJO。但DataNucleus事实上并不能真正直接使用该类。所以DataNucleus採用了一种增强机制,这正是引入datanucleus-enhancer包的原因。

假设不进行增强直接执行会报:

Found Meta-Data for class com.xtayfjpk.jdo.entity.Person but this class is not enhanced!! Please enhance the class before running DataNucleus.异常



增强POJO有两种方式。一种是手动,比較麻烦。还有一种是自己主动增强,但要安装DataNucleus Eclipse插件。插件安装地址为:

http://www.datanucleus.org/downloads/eclipse-update/,推荐使用3版本号。4版本号好像有JDK兼容的问题。安装完插件后。右击project弹出的菜单会多出一个DataNucleus菜单项。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHRheWZqcGs=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

然后加入DataNucleus支持(add DataNucleus support),再选择enabel Auto-Ehancement启用自己主动增强。

DataNucleus之JDO操作演示样例的更多相关文章

  1. java文件夹相关操作 演示样例代码

    java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...

  2. java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

    java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...

  3. android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

  4. MySql的事务操作与演示样例

    事务就是一个逻辑工作单元的一系列步骤. 事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durabi ...

  5. Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ClamReason/article/details/23971805 首先重点推荐介绍otl介绍及使 ...

  6. MyBatis对数据库的增删改查操作,简单演示样例

    之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...

  7. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  8. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  9. Cocos2d-x 3.1.1 Lua演示样例 ActionEaseTest(动作)

    Cocos2d-x Lua演示样例 ActionEaseTest(动作)   本篇博客介绍Cocos2d-x中的动作,Cocos2d-x为我们提供了丰富的动作接口,以下笔者就具体介绍一下:   本系列 ...

随机推荐

  1. Google浏览器开发者工具:CSSViewer(一个Css查看器)

    CSSViewer的简介 CSSViewer是一款可以帮助用户快速查看当前的网页元素的CSS属性的谷歌浏览器插件,在Chrome中安装了CSSViewer插件以后,用户就可以在设计网页的时候,快速地模 ...

  2. 集成新版(5.17+)Activiti Modeler与Rest服务

    声明: 此教程适合Activiti 5.17+版本. 本博客所涉及的内容均可在kft-activiti-demo中找到. 在线demo可以访问 http://demo.kafeitu.me:8080/ ...

  3. Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException;import java.io.InputStreamReader;import jav ...

  4. vue之packages.json添加注释的正确写法

    (1)问题描述 使用vue脚手架vue-cli搭建好项目架构后,在packages.json文件里,加入注释(如下所示).接下来,运行npm run dev命令后出现报错 (2)问题解析 ①记得jso ...

  5. 【东软实训】SQL函数

    SQL函数 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp”的表,接下来的操作都将 ...

  6. WebService 服务开发

    开发 WebService 服务首先需要根据接口的要求编写相关的 wsdl 文件.编写 wsdl 文件需要先对 XML 语法.XML Schema 语法以及 SOAP 语法有一些简单了解. 假设需要提 ...

  7. 一、认识spring框架

    对于spring框架,作为Java开发人员肯定不陌生,大名鼎鼎,名声在外,但是对于spring框架没有进行过系统的学习,从今天开始学习并且记录一下spring框架的比较牛逼的特性. 一.spring简 ...

  8. ionic提供的配色方案

    .light #ffffff .stable #f8f8f8 .positive #387ef5 .calm #11c1f3 .balanced #33cd5f .energized #ffc900 ...

  9. [Python3网络爬虫开发实战] 2.4-会话和Cookies

    在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录.还有一些网站,在打开浏览器时就自动登录了,而且 ...

  10. 树莓派 -- 按键 (key)使用BCM2835 gpio library

    BCM2835 GPIO library介绍 This is a C library for Raspberry Pi (RPi). It provides access to GPIO and ot ...