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. CentOS 7 安装Oracle VirtualBox

    1. 下载VirtualBox的repo文件: 登陆 https://www.virtualbox.org/wiki/Linux_Downloads 在网页的最下端的repo链接上右键下载,或者wge ...

  2. CentOS7 Install Consul

    Centos7 Install Consul 原文链接:http://www.cnblogs.com/caoguo/p/5959962.html 1) 环境 2) 安装 # yum install - ...

  3. Python 源码分析:queue 队列模块

    起步 queue 模块提供适用于多线程编程的先进先出(FIFO)数据结构.因为它是线程安全的,所以多个线程很轻松地使用同一个实例. 源码分析 先从初始化的函数来看: 从这初始化函数能得到哪些信息呢?首 ...

  4. Jmeter之定时器

    转自:https://www.cnblogs.com/imyalost/p/6004678.html 一.定时器的作用域 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位 ...

  5. mac vim设置python语法高亮

    1 "显示行号  2 set nu  3   4 "设置缩进tabstop  5 set ts=4  6 set shiftwidth=4  7 set expandtab  8 ...

  6. Delphi新注释

    标准请看帮助文件里的:XML Documentation Comments 个人常用 <summary></summary>:摘要 /// <summary> // ...

  7. PyTorch学习笔记——softmax和log_softmax的区别、CrossEntropyLoss() 与 NLLLoss() 的区别、log似然代价函数

    1.softmax 函数 Softmax(x) 也是一个 non-linearity, 但它的特殊之处在于它通常是网络中一次操作. 这是因为它接受了一个实数向量并返回一个概率分布.其定义如下. 定义 ...

  8. vue+VeeValidate 校验范围(部分校验,全部校验)

    搜索很久,没有发现有关于vue+VeeValidate部分校验的.自己写一个. 主要是两个场景: 1. 校验范围内,所有的字段. 2. 校验全局所有字段.主要方法: 1.validate(fields ...

  9. ''tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[?]'' 错误分析

    这是tensorflow 一个经常性错误,错误的原因在于:显卡内存不够. 解决方法就是降低显卡的使用内存,途径有以下几种措施: 1 减少Batch 的大小 2 分析错误的位置,在哪一层出现显卡不够,比 ...

  10. Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡

    0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...