注意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菜单项。
然后加入DataNucleus支持(add DataNucleus support),再选择enabel Auto-Ehancement启用自己主动增强。