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;}@Overridepublic 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;@Beforepublic 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有非常多重载的方法,详细请參看APIpmf = JDOHelper.getPersistenceManagerFactory("xtayfjpk");}@Testpublic void testPersistenceManageFactory() {System.out.println(pmf);}@Testpublic 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菜单项。

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

转载于:https://www.cnblogs.com/brucemengbm/p/7151686.html

DataNucleus之JDO操作演示样例相关推荐

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

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

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

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

  3. RPM安装包-Spec文件參数具体解释与演示样例分析

    spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件. 1.Spec文件參数 spec文件包括建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个 ...

  4. Androidclient与服务端交互之登陆演示样例

    今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...

  5. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  6. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

  7. Java 8 时间日期库的20个使用演示样例

    除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务演示样例来学习怎样使用Java 8的这套API.Java对日 ...

  8. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  9. 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  10. 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface)

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

最新文章

  1. 生成对抗网络(GAN)应用于图像分类
  2. Oracle 10g安装64位图解流程
  3. Ajax(jquery)
  4. Linux中文件复制、删除、移动、压缩、解压命令
  5. 有没有想过,你眼中的SQL进阶,别人看来连入门都不是?
  6. 面试官:Object o = new Object() 占用了多少字节?
  7. Spring定时器技术终结者——采用Scheduled注释的方式实现Spring定时器
  8. 如何完全卸载MySQL
  9. 计算机桌面成英文怎样变成中文版,电脑系统菜单全变成英文怎么办
  10. 谷歌浏览器上传下载奔溃问题解决方法
  11. 贵州大学计算机网络试题,贵州大学计算机基础考试题库.doc
  12. 《项目开发团队分配管理软件》
  13. 程序员打造影响力常犯的 3 个错
  14. 分析复联系列电影台词,看看每个英雄说得最多的词是什么
  15. 著者四角号码查询_著者姓名汉语拼音与四角号码数字混编书次号的应用
  16. linux原生安装postgresgl
  17. android 判断APP是否第一次打开
  18. IO Active将工业机器人变为“杀手”,以警示各大机器人公司
  19. 面向对象:13、内部类
  20. 二字动词 复盘赋能_互联网公司晋升必备的高级词汇

热门文章

  1. c#绝对值函数图像_图像处理评价指标之模糊度、清晰度(待更新)
  2. hive jdbc驱动_Hive的安装方式
  3. Graham 三参数表示法 详解
  4. 【Django 2021年最新版教程19】数据库查询 model filter 条件或or
  5. Unity AssetsBundle
  6. Floyd 多源最短路径
  7. css之input时间控件精确到时分秒
  8. PHP设计模式 之 单例模式(封装PDO)
  9. JDBC学习(五、预编译语句对象)
  10. Mac 系统 go-kit安装