persistence java_Java数据持久层 - Persistence Manager Factory

本文探讨了如何在应用程序中使用工厂方法模式来实现与持久层框架的解耦,以便于未来轻松切换不同的持久化工具。通过创建PersistenceManager和Transaction接口及其具体实现(如OJBPersistenceManager和OJBTransaction),Charles Chan展示了如何设计这种策略。他还提出改进建议,包括使用抽象工厂方法来创建不同持久层产品,并考虑提取通用的持久层接口。
摘要由CSDN通过智能技术生成

昨天还在用Torque,今天听说Hibernate更好,明天说不准又有更好的持久层工具...

如何使应用程序不变化的情况下选择不同的持久层呢?

看看Finetix LLC的资深顾问Charles Chan给我们现身说法。

Charles Chan在文章 Object-Relational Mapping with Apache Jakarta OJB

中介绍了Apache OJB的使用,并在文章附录中提到一种屏蔽不同持久层的设计思路,他采用了工厂方法模式(Factory Method),并通过实例Apache OJB来说明他的设计。

这个设计有两个产品,一个是PersistenceManager,另一个是Transaction 。

OJBPersistenceManager和OJBTransaction 分别是两个产品的实现。

It is often desirable to decouple your application from the specifics of a persistence framework, so that you can easily switch frameworks in the future. I recommend creating custom PersistenceManager and Transaction classes for this purpose. For example:

4f1150b881333f12a311ae9ef34da474.png

Example

13

: PersistenceManager and Transaction Interfaces

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png* The abstract base class for all PersistenceManager. It provides

d18c02628675d0a2c816449d98bda930.png* method to persist and object and to obtain the current

d18c02628675d0a2c816449d98bda930.png* transaction.

8f1ba5b45633e9678d1db480c16cae3f.png

*/

4f1150b881333f12a311ae9ef34da474.png

public

abstract

class

PersistenceManager

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

public

static

PersistenceManager getInstance()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

new

OJBPersistenceManager();

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

abstract

void

makePersistent(Object o)

d18c02628675d0a2c816449d98bda930.png

throws

PersistenceException;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

abstract

Transaction currentTransaction()

d18c02628675d0a2c816449d98bda930.png

throws

PersistenceException;

d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png}

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png* A Transaction interface. It provides minimal support for

d18c02628675d0a2c816449d98bda930.png* beginning, committing, and rolling back a transaction.

8f1ba5b45633e9678d1db480c16cae3f.png

*/

4f1150b881333f12a311ae9ef34da474.png

public

interface

Transaction

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

public

void

begin()

throws

PersistenceException;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

void

commit()

throws

PersistenceException;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

void

rollback()

throws

PersistenceException;

8f1ba5b45633e9678d1db480c16cae3f.png}

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png* An OJB specific implementation of the PersistenceManager

d18c02628675d0a2c816449d98bda930.png* class.

8f1ba5b45633e9678d1db480c16cae3f.png

*/

4f1150b881333f12a311ae9ef34da474.png

public

class

OJBPersistenceManager

extends

PersistenceManager

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

private

PersistenceBroker broker

=

null

;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

OJBPersistenceManager()

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.pngbroker

=

PersistenceBrokerFactory.defaultPersistenceBroker();

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

void

makePersistent(Object o)

throws

PersistenceException

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

try

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.pngbroker.store(o);

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

catch

(PersistenceBrokerException e)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

rethrow PersistenceException

ecedf933ec37d714bd4c2545da43add2.png

}

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

Transaction currentTransaction()

throws

PersistenceException

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

new

OJBTransaction(broker);

ecedf933ec37d714bd4c2545da43add2.png}

8f1ba5b45633e9678d1db480c16cae3f.png}

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png* An OJB specific implementation of the Transaction

d18c02628675d0a2c816449d98bda930.png* interface.

8f1ba5b45633e9678d1db480c16cae3f.png

*/

4f1150b881333f12a311ae9ef34da474.png

public

class

OJBTransaction

implements

Transaction

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

private

PersistenceBroker broker

=

null

;

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

OJBTransaction(PersistenceBroker broker)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.broker

=

broker;

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

void

begin()

throws

PersistenceException

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

try

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.pngbroker.beginTransaction();

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

catch

(TransactionAbortedException e)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

rethrow PersistenceException

ecedf933ec37d714bd4c2545da43add2.png

}

d18c02628675d0a2c816449d98bda930.png

catch

(TransactionInProgressException e)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

rethrow PersistenceException

ecedf933ec37d714bd4c2545da43add2.png

}

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

void

commit()

throws

PersistenceException

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

try

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.pngbroker.commitTransaction();

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

catch

(TransactionAbortedException e)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

rethrow PersistenceException

ecedf933ec37d714bd4c2545da43add2.png

}

d18c02628675d0a2c816449d98bda930.png

catch

(TransactionNotInProgressException e)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

rethrow PersistenceException

ecedf933ec37d714bd4c2545da43add2.png

}

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

public

void

rollback()

throws

PersistenceException

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

try

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.pngbroker.abortTransaction();

ecedf933ec37d714bd4c2545da43add2.png}

d18c02628675d0a2c816449d98bda930.png

catch

(TransactionNotInProgressException e)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

rethrow PersistenceException

ecedf933ec37d714bd4c2545da43add2.png

}

ecedf933ec37d714bd4c2545da43add2.png}

8f1ba5b45633e9678d1db480c16cae3f.png}

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

After the above classes are created, it is very simple to convert the test application to use them:

下面是这个Factory的使用:

4f1150b881333f12a311ae9ef34da474.png

Example

14

: Example Using PersistenceManager and Transaction Interfaces

4f1150b881333f12a311ae9ef34da474.pngPersistenceManager pm

=

PersistenceManager.getInstance();

4f1150b881333f12a311ae9ef34da474.pngTransaction tx

=

pm.currentTransaction();

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngtx.begin();

4f1150b881333f12a311ae9ef34da474.pngManager manager

=

newManager();

4f1150b881333f12a311ae9ef34da474.pngmanager.setName(

"

John Smith

"

);

4f1150b881333f12a311ae9ef34da474.pngmanager.setProjectNumber(

new

Integer(

10

));

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngpm.makePersistent(manager); 

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngEmployee employee

=

newEmployee();

4f1150b881333f12a311ae9ef34da474.pngemployee.setName(

"

David Cosby

"

);

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngpm.makePersistent(employee); 

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngtx.commit(); 

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

It looks surprisingly like JDO, doesn't it? With a little more effort, you can also hide the OJB query mechanism.

改进建议:

1. 改用抽象工厂方法, 一套持久层产品提供一个工厂,用于创建不同的产品(如:PersistenceManager,Transaction....)

2.考虑从不同的持久层产品中抽取一套通用的持久层接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值