这是在关系型数据库和面向对象的软件接口时的经典问题。解决这种问题的一般方法是加一层影射将数据库纪录影射到对象。但是EJB的entity bean本身已经是直接和数据库纪录相影射,所以不可能在其中再加程序来解决(除非不用entity bean)。以我粗浅之见,可以改变数据库表结构然后通过象Oracle的trigger一类的东西来解决这个问题。比如,增加一张表来存放需要删除的表和它的条件,当一个新纪录插入这张表时,一个insert trigger就会被触发,在这个trigger里实现delete from <table> where <condition>。
顺便说一下,其实DELETE FROM table WHERE col='xx'在执行的时候也是一条一条的删除的
是一条一条删的,但是行为发生在数据库内,从客户端发给数据库的指令只有一条,交互一次
而EJB按我说的方法,可是要发N条,交互N次了
ejb是从面向对象的角度考虑问题的,而不是面向数据库考虑问题。想想在你编写程序的时候既要控制逻辑,又要随时考虑数据库的每一个表,每一个字段,表之间的关系...,这其实才是麻烦事
UNQUOTE在编程序的时候当然要考虑数据库的结构问题,而且还要考虑优化的问题
可以改变数据库表结构然后通过象Oracle的trigger一类的东西来解决这个问题
UNQUOTEtigger是个很危险的东西,对性能的影响可能十分大
我觉得只能许在100 rows以下,很少更新的表,例如参数表里面用trigger
你有没有试过在一个百万行,数十列的表里面定义trigger?update的时候就很难看了
QUOTE
至于EJB性能这方面的问题其实你根本不用担心,这都是由想IBM,BEA等。这些大公司已经优化好的了,性能一定要比你使用传统的连接方式要好的多
UNQUOTE我想EJB CMP的性能再好,在数据库方面也不及store procedure吧
看过一些文章,说他们一般都会出于性能考虑而用BMP而不是CMP
当时学SQL的时候,这是个比较好玩的东东,但是据说因为它对性能的影响极大,很多数据库在实施中都避免使用trigger
BMP还有N+1查询问题。像这种记录删除的问题,我想在finder 和 remove 都是在同一事务中,finder应该是bulk operation,一次网络调用,我想remove也应该是bulk operation,这与直接用SQL性能差不多。