JDO-1

       JDO提供了灵活的ORM机制,使持久化典型领域模型相当直观。对象的持久化标识可用来在数据库里识别这个对象,使用JDO持久化领域模型时,必须做出一个决定是各个类使用哪种对象标识,JDO提供3种不同类型:应用程序标识数据存储标识非耐久标识。非耐久标识只用于特殊情况,比如日志文件的数据库表没有主键,对于大部分数据库应用程序来说,这种标识并不适用。这里需要注意的是同一继承体系里的所有类必须使用同一种标识

一、应用程序标识

       持久化标识由应用程序管理,存储在对象的单个或多个成员变量中。应用程序标识的一大优点是应用程序可随意访问对象的持久化标识,因为它就存储在对象里。主要缺点是主键在领域模型中通常是没有实际意义的,因此你必须在使用应用程序的每个类中添加主键成员变量,下面是一个简单的例子,类的代码如下:

class PendingOrder{
	private int id;
	public int getId(){
		return id;
	}
	……
}
XML的配置文件如下:
<class name="PendingOrder" identity-type="application">
	<field name="id" primary-key="true" value-strategy="native"/>
	……
</class>
其中primary-key="true"用来标识id将被用作一个主键,而value-strategy="native"则标识JDO实现根据底层数据库选用最合适的标识符生成策略。获取id=555的方法如下:
String idString = "555";
IntIdentity objectId = new IntIdentity(PendingOrder.class, idString);
PendingOrder p = (PendingOrder)pm.getObjectById(objectId);
其中的pm的类型是PersistenceManager,JDO中的大部分操作通过它来完成的。IntIdentity是一个内置的JDO单成员标识类,调用getObjectById就可以返回PendingOrder了。

二、数据存储标识

       对象的持久化标识完全由JDO实现管理。类的O/R映射指定主键字段,但并不将它们映射到该类的任何成员变量。所有内存中的JDO对象的持久化标识都由PersistenceManager维护。下面是一个数据存储标识的XML配置文件:

<class name="PendingOrder" identity-type="datastore">
	<datastore-identity strategy="native" column="PENDING_ORDER_ID"/>
</class>

因为identity-type的默认值就是datastore,这样如果配置文件中不出现primarykey="true"的话这个属性是可以忽略的。column="PENDING_ORDER_ID"用来指定PENDING_ORDER_ID为主键字段。下面是在java代码中获取PendingOrder对象的代码:

HttpServletRequest request = ...;
String idString = request.getParameter("pendingOrderId");
Object objectId = pm.newObjectIdInstance("endingOrder.class, idString);
PendingOrder p = (PendingOrder)pm.getObjectById(object);
因为主键字段并没有映射到对象的成员变量,应用程序必须先通过一些方法或获取到ID,然后再根据这个ID去获取具体的对象。从这里可以看出数据存储标识的第一个缺点就是操作复杂。这个缺点可能使得代码中各种位置为了获取对象的ID而添加JDO的调用。在上面的代码中把ID保存在了URL中然后通过request来获取,这里可以看出第二个缺点,URL或变得很长(因为保存的通常是完整类名加主键)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值