很简单的啊。这样:
在ejbCreate()中,参数不用出现主键,在部署文件中,修改weblogic-cmp-rdbms-jar.xml如下:
    <automatic-key-generation>
      <generator-type>SQL_SERVER</generator-type>
    </automatic-key-generation>
例如:
<!DOCTYPE weblogic-rdbms-jar PUBLIC
 '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB RDBMS Persistence//EN'
 'http://www.bea.com/servers/wls700/dtd/weblogic-rdbms20-persistence-700.dtd'>
<weblogic-rdbms-jar>
  <weblogic-rdbms-bean>
    <ejb-name>mssqlserverSequence</ejb-name>
    <data-source-name>examples-dataSource-mssqlserverXAPool</data-source-name>
    <table-map>
    <table-name>ejbAccounts</table-name>
    <field-map>
      <cmp-field>accountId</cmp-field>
      <dbms-column>id</dbms-column>
    </field-map>
    <field-map>
      <cmp-field>balance</cmp-field>
      <dbms-column>bal</dbms-column>
    </field-map>
    <field-map>
      <cmp-field>accountType</cmp-field>
      <dbms-column>type</dbms-column>
    </field-map>
    </table-map>
    <automatic-key-generation>
      <generator-type>SQL_SERVER</generator-type>
    </automatic-key-generation>
  </weblogic-rdbms-bean>
  <create-default-dbms-tables>True</create-default-dbms-tables>
</weblogic-rdbms-jar>
其中accountId是自增主键。

解决方案 »

  1.   

    C:\bea\wlserver6.1\samples\examples\ejb20\sequence
    weblogic自己有例子的
      

  2.   

    还可以在ENTITY BEAN前加一个SESSION BEAN,时时检测主键,然后向entity bean 发布主键信息。
      

  3.   

    <automatic-key-generation>
                <generator-type>NAMED_SEQUENCE_TABLE</generator-type>
                <generator-name>sequence_table</generator-name>
                <key-cache-size>10</key-cache-size>
    </automatic-key-generation>
    用序列表来实现
    其中sequence_table为:
    create table sequence {
       sequence int not null //这个字段明必须为sequence int not null
    }
      

  4.   

    数据库若为Oracle该如何处理呀!!!
      

  5.   

    什么乱七八糟的,全部都错,首先是确定现在数据库字段中的最大列值是几如果现在的最大ID值是10那好,下一个那将插入的id肯定是11是不是,先确定这点,然后,来写一个find方法命名为findMaxId :
    SELECT OBJECT s FROM STUDENT(s)
    好,然后,手改jboss-cmp.xml文件(我用的是JBOSS3)在jboss3中写入jboss ql语句(一种独立于ejbql的语句),因为ejb ql不提供SUM,MAX,ORDER BY这些东西,所以给人骂死了,但在2。1中将提供,到时,就要爽翻了
                <query>
                <description/>
                <query-method>
                <method-name>findMaxItem</method-name>
                <method-params>
                </method-params>
                </query-method>
                <jboss-ql>
                <![CDATA[SELECT OBJECT(m) FROM Message m ORDER BY m.titleid DESC]]>
                </jboss-ql>
                </query> 
    OK,现在可以写CMP的代码喽:
    long tid=getMaxItem();
          tid+=1.0;
          MessageHome messageHome=getMessageHome();
          Message mbean=messageHome.create(new Long(tid),bounds,
                                           java.sql.Timestamp.valueOf(messageTime),
                                           content,title,mood,pid,
                                           picture,space);
    getMaxItem()的代码如下:
        try{
          Collection c=getMessageHome().findMaxItem();
          Iterator it=c.iterator();
          if(it.hasNext()){
            Message mbean=(Message)it.next();
            String tempstr=""+mbean.getTitleid();
            int max=Integer.parseInt(tempstr);
            return max;
          }
          else
          {
            return 0;
          }
        }catch(Exception ee){
          return 0;
        }
      

  6.   

    我也遇到类似的问题,但我用的是websphere,不知该如何处理。
      

  7.   

    用session bean取得maxId的话,可能会有conflict,可能需要加一个事务处理
      

  8.   

    我的这个解决方法已应用于常熟电厂(国家一级大型),机桐乡电厂(国定一级)并且在SUN公司的网站上被定义为最好的解决方法,看上去很吓人,但实际会做了,很简单,这都是由于EJB2。0不提供sum,max,order by的结果,但是JBOSS有自带的EJBQL,可以花100美元买一本JBOSS的手册看一下,上面有JBOSS QL或者自己到斯坦弗的FTP网站上下几本,不过那几本都是10美元级的,不是很好,还有一个问题,就是关联表插入值时会碰到duplicate column define的问题,这两个问题被誉为EJB2。0的bottle nect,因此我花了近一个月的时间,好多晚上的通宵才试出来的。
      

  9.   

    其实很简单的东西,一般的做法是在数据库中写个触发器就行了,而在cmp中的create()方法中只要随便传送一个什么字符就行了。当进行增加时,触发器就会自动在你要增加的主键上加"1".
      

  10.   

    程序处理主键方式:
    1.使用singleton模式,从应用程序第一次运行,把所有表的主键给读入内存,
    在内存维护增长
    2.使用时间做主键
    数据库处理主键模式:
    1.触发器
    2.各个数据库特定的方法,oracle:sequence,sqlserver:identity
      

  11.   

    有人提到过在数据库中用触发器的问题,我当时确实也是这样考虑的,但付出的代价是你的ID不可以是primary key,因为primary key在CREATE中传入后,触发器做的事是把这个ID+1,就等于传了一条set语句,各位可以去用CMP试一下,先用CREATE写一条记录进去,然后用SET方法更改这条刚传入的记录的id值,看看在WEBLOGIC,JBOSS,中报的是什么错,要知道,你想得到的方法,SUN论坛在一年前都已有人试过了,因此有一个人写了100多个贴子说为什么他恨CMP2。0的EJB,这都将在ejb2.1中得到改进,另外,大家编写EJB时刚开始都用的是jbuilder+WEBLOGIC实际上这已经更改了真正的ejb的规范了,真正规范的EJB是用vi+ant写出来的,往往JBUILDER里面有一些小地方法会造成在ejb编写时的不便鞋,如自己写JBOSSQL语句时,只要一编译,xml文件又会变为JBUILDER的XML的格式了,而JBUILDER产生的XML文件是最不规范的
      

  12.   

    回无缺公子
    国人在解决EJB的瓶颈时都是从数据结构着手,这并不显得国人就怎么聪明,实际上这才体现了国人的笨,你想一个ORDER BY的功能,你要用什么自建数组来维护,效率时间功能上的东西就不考虑了??看看老外怎么解决的,一条<![CDATA[SELECT OBJECT(m) FROM Message m ORDER BY m.titleid DESC]]>JBOSSQL的语句就解决了,把空下来的时间放在研究项目的通用性上和功能上,因此强烈建议大家在LINUX下用VI结合ANT手写EJB,不要再用JBUILDER和WEBLOGIC这种烂东东了
      

  13.   

    我也很想知道WEBLOGIC+JBUILDER下的解决方法.
    帮忙顶顶.
      

  14.   

    weblogic??谁会有那个东西,受不了,ant jboss vi mysql完美组合??
    什么都要用免费的,你的工程才值钱,jboss比WEBLOGIC好不知道多少倍!!!
      

  15.   

    讲了这么多,就是没有提出一个在JBuilder下的解决方案,“在LINUX下用VI结合ANT手写EJB”,如何才能达到如此高的境界?XML文件我可是一窍不通。
      

  16.   

    似乎不是很复杂的问题吧,搞得好夸张哦,我也说一个方案:sessionFacade中:public User createUser(String userName, String userPass) {
      Long userId = sequence.getNext(userSequenceName);
      User user = new UserDto(userId, userName, userPass);
      userLocalHome.create(user);
      return user;
    }说明:
    1. sequence 是一个 stateless sessionbean 用来做sql “select sequenceName.nextval from dual”并返回结果。
    2. userLocalHome 是 local entity bean 的 localhome 接口,提供 create 方法。
    3. userDto 实现 User 接口,是 User 的 valueObject。
      

  17.   

    回 jackyz(J.) 
    你数据结构学得很好,可是你不配做一个企业级开发程序员!!
    国人在解决EJB的瓶颈时都是从数据结构着手,这并不显得国人就怎么聪明,实际上这才体现了国人的笨,你想一个ORDER BY的功能,你要用什么自建数组来维护,效率时间功能上的东西就不考虑了??看看老外怎么解决的,一条<![CDATA[SELECT OBJECT(m) FROM Message m ORDER BY m.titleid DESC]]>JBOSSQL的语句就解决了,把空下来的时间放在研究项目的通用性上和功能上,因此强烈建议大家在LINUX下用VI结合ANT手写EJB,不要再用JBUILDER和WEBLOGIC这种烂东东了
      

  18.   

    听不懂,一个绑定在WLS,一个依附于jboss。我觉得还是用数据库的sequence比较好,这样的机制比较自然一点吧。
      

  19.   

    回 lifetragedy(生活是场悲剧)谢谢指教,不过,实在惭愧,本人数据结构其实学得很糟糕,勉强过关而已。而且,对不起的是,本人配不配做一个“企业级开发程序员”与你无关,更与问题本身无关。在此只能原话奉还。其次,被冠以“国人如何如何,老外怎么怎么”,实在令本人惶恐。遗憾的很,本人的言论只能代表自己,我实在看不出自己够资格代表哪几个伟大或者卑微的“国人”。所以关于“国人”的评论,也请您原封收回。扯远了,回来问题本身:关于通用性sequence 问题,有着很多可选的实用的解决方案:有用无意义顺序码的,有用数据库记录数量条数的,有用日期加上其他字段组合编码的,当然,还有很多其他富有创意的想法。我的 sequence sessionbean 的设计意图是将“sequence 的生成逻辑”单独包装起来,正是一种提高通用性的努力。比方,在某个特定环境下,你不能再从数据库中得到 Sequence 值。这时,你可以单独修改 sequence ,让它从文件、内存、系统时间、或者其他的  whatever 中取得合理的值,而程序的其他部分,不需要改动任何一个字。 JBoss 固然很好,我自己的项目也准备采用,但是如果你的程序必须限制要在 Jboss 下运行,不能被移植到 weblogic 或者其他 appserver 上,通用性难道就很好么?BTW.
    本人不才,平日也用 Ant 手写开发,不过不是用厉害的 Linux+vi ,而是用不入大侠法眼的 Win2k+UltraEdit 。之所以不用 JBuilder,非不想也,实不能也,想必我的破赛羊是拉不动的。用了一年多,并不觉得这样的方式就比别人如何高明了。传说真正的高手“草木皆可为剑”?手写EJB?无他,唯手熟耳。再说了,更高手的好像是老板,一声令下,我辈立刻要屁颠屁颠的加班写代码,他们何曾动手写过哪怕是一行?---------
    重剑无锋◎大巧不工
    ---------
      

  20.   

    同意 jackyz(J.) 关于sequence的问题,的确有很多解决的访问,各有适用地方。
    应用服务器的选用,也是要考虑很多方面的原因,有时候甚至不是自己能够掌握的,应该说,这个使用order by的方法可能确实比较简洁,但必须要用ejb2.1,可很多时候实在没条件用,难道项目就不要做了?就类似于现在都有了飞机汽车,那怎么还有人骑自行车,大多是因为条件所限把。
    这位仁兄可能比较推崇jboss,可也不用如此贬低weblogic把。关于手写ejb,我也是用win2k+ultraEdit,主要是觉得速度较快,比较方便,倒也不是炫耀自己是高手等等,也炫耀不了什么。其实是因为JB之类的功能比较强大,所以使用也比较复杂,我一时间没耐心去研究。但其实这些IDE能够帮你生成一些代码,减少一些重复劳动的烦恼,又何乐而不为呢,又何必非得手写来故作高深呢。
      

  21.   

    竟然会有人用SEQUENCE,从未听说过,大概在10万元级以下的小项目会那私用,如果是主关键字,在CREATE以后,能修改,就见鬼了,记得去年在印度的J2EE大会上,我已经把这个问题讲述的很清了,中国人,受不了!!!
      

  22.   

    编程要用IDE,也是让人受不了的事,清华内编程好的人都是NOTEPAD或VI,开八个PANEL,16个VI,都是这样编的,一天也是几千行代码,至于调试困难,是因为你们水平臭,编完后,很多错误导致的!!!
      

  23.   

    听大家这么说,我有一个疑问:
    使用vi,或者ultraedit的兄弟们,你们的调试怎么调的,我说的对于ejb的调试,因为我发现jbuilder的调试还是很好用的。lifetragedy(生活是场悲剧)说的对,调试是因为程序里面有错误,但是我只听说很少的人编程序是从来不调试的。哦~~我不想和谁辩论。。我只是想知道,如果不是用ide的话,对于ejb的调试是怎么处理的?就用println?么/
      

  24.   

    “去年在印度的J2EE大会上,我已经把这个问题讲述的很清了”
    “中国人,受不了!!!”
    “清华内编程好的人都是NOTEPAD或VI,开八个PANEL,16个VI”呵……,您牛!我等“水平臭”的,做“10万元级以下的小项目”的,没钱参加“印度的J2EE大会”的,就不多和大虾您废话了……,哈哈~~
      

  25.   

    对于EJB的调试,从未听说在IDE里调试,SUN的TUTORIAL,JBOSS的TUTORIAL是怎么写出来的,ECLIPSE结合VI,如果大家真的很像做和我一样的牛人,脱离开IDE(只有脱离JBUILDER写出来的代码才纯)请去看wrox公司出版的XP编程(我在这儿不对XP这个词做解释,考考大家怎么离解这儿的这个XP是什么意思)
      

  26.   

    EJB 当然可以在 IDE 中调试啦, 尤其是 Session Bean, 调试还是需要的.我用 Eclipse 就能调试 EJB, 使用 JPDA 远程调试.
      

  27.   

    同志们,不要再吵啦!这个问题在JBuilder+WebLogic下到底怎么解决?
      

  28.   

    to: tusm()我所说的 sequence 方案,是一个可行的解决方法(虽说牛人同志并不认为它是一个好方法,但至少管用),你可以在自己 JBuilder + Weblogic 环境下去实施它(或者修改它)。相关的源代码可以参见本版已结贴的:“oracle的sequence怎么在EJB中实现???” ( URL: http://expert.csdn.net/Expert/TopicView1.asp?id=1224025 )顺便说一句:
    方法是一个行而上的东西,和你用 JBuilder 做开发或者用 WebLogic 来运行并无关系。作一个或许不太恰当的比喻。如果你要写一篇小说,不会说仅仅因为你是用纸和笔来写的就会变成一篇滥文,也不会说仅仅因为你是用电脑写的那就会变成传世精品了。草木皆可为剑?神兵利器或者一块烂木,也只是工具罢了。
      

  29.   

    jbuuilder+weblogic??倒!真正编程的人谁会用WEBLOGIC,你的方案是用WEBLOGIC布署的,CALL,没人用了
      

  30.   

    to: tusm()可以参看www.theserverside.com的ejb design patterns那本书,有一章讲到sequence generator,有完整的代码。部署起来就行了。to: lifetragedy(生活是场悲剧) 
    不知道这位大哥为什么非得说weblogic不好?非得死扣jboss不放?
    做的更通用一些不好吗?
    我不知道你是不是真的明白,这些方案其实都是和应用服务器无关,部署在哪个上都可以的。
      

  31.   

    Support jackyz(J.) and charleyshen(shenpf) 
    :-)
      

  32.   

    请问在CMP中如何处理自动增长的主键? 
     自动增长的主键 的问题 在Jbuilder下的samples下EJB有一个
    非常简单的方法:(我觉得简单实用为最佳:)
      原理基本上:另建立一库和与之对应的EJB ,最大的ID、和数据库名,
    用此库来管理,应新增的ID的值。
      
      selectNextMaxID
      
      
      

  33.   

    另外建库,受不了,加大程序开销用WEBLOGIC,OK,你在WEBLOGIC下做一个,到JBOSS,WEBSPHERE布署一下,布署得上,我把你打一顿,布署不上,你自己去跳希尔顿,真没想到这个问题暴露了一大群无知的人,就像清华BBS上说的一样,CSDN上都是一群蠢驴!!!强人都在清华BBS
      

  34.   

    嗯,用JBOSS,OK,你在JBOSS下做一个,到weblogic布署一下,布署得上,我把你打一顿,布署不上,你自己去跳希尔顿,真没想到这个问题暴露了一w个自大的人……CSDN上的人也许比清华BBS弱一点,不过就是因为不懂所以才发问,你是想把天下的初学者都逼死还是怎么的?是不是一群蠢驴我不知道,有清华BBS强人我也相信,不过关你什么事啊?你以这样就可以标榜你是强人了吗?印度的J2EE大会有什么了不起?有钱就能去,你这么强还来这里做什么?你这么强就不用做什么软件了,做老板去吧……
      

  35.   

    哎 , 
    lifetragedy(生活是场悲剧)可能你是比较牛
    感觉用这句话 最能贴切的反映我的心情, 我鄙视你 :)奉劝1句,在抬高自己的时候,不要去贬低别人。“中国人,受不了!!!”
    “清华内编程好的人都是NOTEPAD或VI,开八个PANEL,16个VI”
    《--- 清华人不是中国人吗?
      

  36.   

    lifetragedy(生活是场悲剧),你是哪个学校的?这句话“就像清华BBS上说的一样,CSDN上都是一群蠢驴!!!强人都在清华BBS”是你从smth上哪个版看来的?不会是你在smth上发的吧?要是有人在smth上这样说话,早被封全站了...呼呼...