| 作者 |
内容 |
| subfm |
请教一下:存储在关系数据库中的商务对象如何实例化
比如对象employee,存储在一个叫做EMPLOYEE的表中,每一行代表一个employee.我现在的想法是:
设计一个Employee类,她存储了employee的所有属性
她的操作包括:构造函数、modify(本地的修改)、得到属性的函数、其他的本地操作
再设计一个EmployeeManager类,操作包括:
GetEmployee(根据ID查询、构造employee)
InsertEmployee
DeleteEmployee
ModifyEmployee
这些操作将对数据库做查询和修改
请大家看看我这么做有什么不好的地方
不知道大家遇到这样的问题是怎么处理的? |
| 02/07/01 00:50 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| steve_zhang |
回复:
请教一下:存储在关系数据库中的商务对象如何实例化
I am wondering how could query it?
I prefer to use ejb. I think the ejb is used to map the relationship
database to an Object System.
By the way, what kind of Database are u using? |
| 02/07/01 02:36 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| Charity_Zhou |
不妥
请问EmployeeManager是什么样的Manager?是个部门管理者还是老板?
只有老板才能Insert、Delete一个Employee
如果是部门管理都则不应有这些操作,而且EmployeeManager应是Employee的子类
另外,所有记录放在一个表中,则需要一个Factory,当从数据库中取得数据后,应由此Factory决定实例化的对象是Employee还是EmployeeManager
先列出对象及对象关系,再来考虑如何实例化。 |
| 02/07/01 09:04 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
回复:
不妥
我定义的EmployeeManager就是你说的那个Factory,可能名字起的不好巴,能不能用Factory来做EMPLOYEE的插入、修改、删除操作,再加上employee的构造操作?
我得想法是把employee对象的操作和EMPLOYEE表数据库的操作分离开,请问有什么合适的模式可以让我参照?
那个PersistenceLayer.pdf的文档我看过了,太复杂,不太适合我作的项目,我需要一个简单而实用的方法解决这个问题。请各位提供一些参考!
我的设计环境是JBuilder6,用JDBC连接SQLServer2000,ejb我还没学 |
| 02/07/01 18:11 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
回复:
请教一下:存储在关系数据库中的商务对象如何实例化
我的设计环境是JBuilder6,用JDBC连接SQLServer2000,ejb我还没学呢
我需要一个简单而实用的方法解决这个问题。请各位提供一些参考
我想 |
| 02/07/01 18:16 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| guxf@bigfoot.com |
如果是需要简单方法,系统不大,业务也不复杂,这样做可以。
|
| 02/07/01 20:17 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
回复:
请教一下:存储在关系数据库中的商务对象如何实例化
你应当设计一个类,完成内存对象向数据库的Seek、Insert、Update、Delete操作。然后所有的业务类(包括Employee)继承它。没必要实现EmployeeManager。实现它反而不是“纯”的面向对象风格。因为EmpoyeeManager是纯粹计算机意义的。你的Employee既然把保存数据作为关键,就在接口中自己体现出来,使用额外多出来的非业务而太技术化的对象对于将来读这段程序是“弄巧成拙”。
你应当定义标准的数据库操作。在Employee中,假设Update的操作更复杂,假设需要先查询一下,则覆盖这个操作,先写查询的代码,然后再重新调用父类的Update操作。 |
| 02/07/01 21:35 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
一些疑问
假如按照你的想法,设计了一个基类BaseClass,实现了标准的数据库操作
然后从BaseClass派生了一个Employee,可是BaseClass并不知道Employee具有什么样的属性亚,也不知道EMPLOYEE表的位置阿,我不明白BaseClass的数据库操作函数怎样实现才能适应所有得业务对象呢?真的不明白阿
难道BaseClass只是个抽象的接口么? |
| 02/07/01 22:39 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
如果BaseClass知道Employee的新属性,就不是对象风格,就纯粹是结构化风格了。尽管你使用OO的语言,整个思路没超出结构化想法。
初始化BaseClass时作为构造参数传递数据库表对象。
在实现Insert、Update、Delete时比较好办,对当前记录缓冲内的记录进行普通的数据库操作。关键是Update、Delete操作中需要使用Seek操作。
此Seek操作恰好是纯虚拟的,必须由后继类覆盖。一旦定位到记录后,BaseClass负责将记录读进记录缓冲区(如果数据库表对象有此功能则不必自己编码)。
业务对象,如果数据库操作与BaseClass一样,就只需要继承就行了。如果某个操作更复杂,可以先进行其他处理,然后再调用BaseClass的操作。如果有禁止哪项操作,只需要覆盖相应操作并且引发一个运行时错误就行了。 |
| 02/07/01 22:48 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
非常感谢!你说的没错,我心服口服
为什么我就想不到用一个表对象作构造函数的参数呢。。。
诶。。 |
| 02/07/01 23:11 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| steve_zhang |
回复:
如果BaseClass知道Employee的新属性..A good Idea
Hi, buddy:
I admire you and really learned a lot from your posts.
但我有个疑问-那在这里面向对象的目的是什么?我想商务对象的事例化不会是指简单的把表做成Class.
If the class only includes the attributes and insert/update methods,
what benefits can we get from it?
By the way, I am wondering where you implement the query method? And
how do you handle the results. |
| 02/07/02 02:48 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| areslee |
回复:
不妥
1、工厂方法只应该构造对象,跟对象有关的操作应该由对象自己完成;
2、对象-关系映射本身是一个很复杂的问题,如果自己解决不了,可以使用人家已经做好的东西,我建议你参考一下APACHE的Torque,这就是一个开源的对象-关系映射工具,用起来也比较简单。
URL:http://jakarta.apache.org/turbine/torque/ |
| 02/07/02 08:38 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
一个中学生学阶乘的定义,必是从“1的阶乘等于1,2的阶乘等于2,3的阶乘等于6,...”这样的“拼凑”方式开始了解意义的。但是学习的目的就是以后不必再拼凑答案。你提问的Why,How就是拼凑答案的思路。继承是为了什么?就是在还不知道具体细节时就写出高层次的程序!
|
| 02/07/02 20:53 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
如果你觉得BaseClass不够,可以在加一个子类嘛。但是记住,我们的思路好你现在的思路“完全相反”就行了!
|
| 02/07/02 21:01 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
所以他们是可以被覆盖的。假设删除用户权限设置前先判断最近2天是否访问过次权限,则首先写判断代码,然后调用父类的Delete操作。
|
| 02/07/02 22:06 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
可是我觉得这样设计反而不是很方便呀,还有insert怎么处理?父类的insert操作作什么样的工作?
|
| 02/07/02 22:10 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
回复:
不妥
我正在研究,谢谢! |
| 02/07/02 22:14 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
如果子类不需要覆盖Insert就不覆盖,即使覆盖了其中与父类Insert一样的代码也最好不重复写,而是调用父类的Insert。这样的好处是真正说明如何完成类似父类的Insert操作的代码只在一处定义。比如说你的数据库改为另一种,你的所有Insert需要重写,那么你只要改一处。
|
| 02/07/02 22:15 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
我得意思是如果ClassA
|
| 02/07/02 22:20 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
我得意思是如果ClassA的属性是a,b,c,ClassB的属性是d,e,insert操作显然和ClassA、ClassB的属性有关阿,父类的insert好像没有什么公共的操作阿
|
| 02/07/02 22:24 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| w_rose |
“有关”但不是完全清楚呀。数据库对象不知道每个字段到底有什么业务作用,照样可以读取、更新数据字段呀?
|
| 02/07/02 22:32 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| subfm |
ok,让我花点时间考虑一下,我下线了,88
|
| 02/07/02 22:34 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| ayxj |
回复:
如果BaseClass知道Employee的新属性,就不是对象风格,就纯粹是结构化风格了。尽管你使用OO的语言,整个思路没超出结构化想法。
初始化BaseClass时,由谁来实例化你所说的数据表对象(作为BaseClass的构造参数)?毕竟BaseClass是先于子类构造呀!如果说在BaseClass中定义一个虚方法,在子类覆盖,这样BaseClass运行会报调用了未实现的方法。
这个问题实质上说是说应该由谁来初始化一个具体的业务对象。我认为你所说的情况实际上是业务对象已经完成实例化后如何进行数据库操作的问题嘛! |
| 02/07/03 09:21 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| guxf@bigfoot.com |
Employee为什么要知道自己是如何被保存的呢?
如果以后数据保存的机制变化了呢?DomainClass(象Employee)对对象持久化机制了解得越少越好,了解得越少,依赖就越少。
OO的系统,到了实现阶段为什么就不能有纯粹计算机意义的类呢?有了就不是“纯的”OO了?这种说法没有道理。
把数据存取逻辑抽取出来,形成对象持久化层,这是好的设计。将来技术发展了,只要替换这一层,就可以使用新的对象持久化技术,也可以发展成能适应多种数据存储方法。 |
| 02/07/03 10:59 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|
| dhuwym |
回复:
Employee为什么要知道自己是如何被保存的呢?
Employee dhuwym = new Employee("dhuwym");
Employee dhuwym = old Employee("dhuwym");
hehe! |
| 02/07/03 13:23 |
酷帖! 臭帖! 回复 |
|
酷帖评价: 臭帖评价: |
| 返回页首 |
|