好像是这样的。你不用关心ejbCreate方法如何给容器返回主键,容器会自动处理这个过程,就像你在数据库中新增一条记录一样。

解决方案 »

  1.   

    to :keen_9 新新可是如果这个表内除了ID字段根本就没有别的字段可以作为主键呢?比如说报警表,各个地方都能报警,而且报警内容也有可能相同,并且各个地方可以报多次警,这样的话,也只有拿ID字段作主键,而且,ID字段也只是拿来计数用而已!
      

  2.   

    有!
    不过方法有点土  ^_^
    我们的id主键字段设置为自增的
    然后写了一个方法用sql专门取得下一个主键值
    然后在ejb的create方法中调用这个方法得到主键值
    也是没办法啊
      

  3.   

    我们式oracle数据库
    有sequence对象
    在插入之前,先查询sequence
    就知道下一个值了
      

  4.   

    哎,这两个方法也可以搞定,但太麻烦了呀。更何况,BMP还好,如果是CMP又该如何呢?
      

  5.   

    大家快来啊,多讨论讨论,UP,UP!~~~~~~~~~~~~~~
      

  6.   

    bmp: 楼上有解决办法,如果是ms sqlserver,有一个语句可以插入数据同时返回id.
    cmp: 那就要看容器是否支持数据库的自增了. weblogic支持sqlserver和oracle..其他的就不清楚了...
      

  7.   

    to zez(思恩 为老婆多挣钱 鹤清风):
    敬仰之~~~~~~~~~~~~~~~~~~~~~~
    “如果是ms sqlserver,有一个语句可以插入数据同时返回id”,请问这个语句怎么弄?怎么写呢?“那就要看容器是否支持数据库的自增了. weblogic支持sqlserver和oracle..”,如果支持,在create方法里容器能直接得到主键吗?
      

  8.   

    为什么一定要设为在数据库层设置自增型主键呢?如果是Oracle数据库,那你怎么办?所以建议还是自己写Sequence,而且如果利用一些高效模式写的好的话,效率、响应时间和吞吐量一样是很高的。
      

  9.   

    这个我实现过,也只有WEBLOGIC支持,所以要看你使用什么服务器了和数据库了
      

  10.   

    在开发CMP中,假如你设定了主键,那么ejbCreate中就必须包含主键,否则是部署不过去的(我用的是Weblogic),看楼主的这种情况,那肯定是主键与业务逻辑无关的这种了,在这种情况下,就更不可以由客户输入主键值,只能有数据库自动生成或是写一个生成主键的算法,我觉得有几种解决方法:所有的方法有一个共性,就是虽然客户将自认为的主键输进去都无效,因为我在ejbCreate中根本就没有setKey()的调用,另外在本地和远程接口中也不能有主键的set,get操作.1:可以在ejbCreate中调用一个l类KeyPool的protected getNextKey(String className)方法,该方法从XML文档中读取SQL语句,对数据库进行操作.在KeyPool中读取数据库中专门用来存储主键的表(见<Java与模式>),可以提供缓存功能.另className代表该Entity的名称,他与XML中的名称想对应.2:调用数据库的存储过程3:调用数据库的Insert响应.4:将该字段设为自动增量5:用CMP封装数据库中用于存储各个主键值的表,然后再调用之(最笨)
      

  11.   

    为了达到你的bean的可移植性,应该写sequence,
      

  12.   

    据我所知,对于主键自动增长的问题,j2ee规范并不明确,各家ejb容器均有自己的做法,对于使用weblogic+oracle,可以这样来做(weblogic文档中节选)Specifying Primary Key Support for OracleGenerated primary key support for Oracle databases uses Oracle's SEQUENCE feature. This feature works with a Sequence entity in the Oracle database to generate unique primary keys. The Oracle SEQUENCE is called when a new number is needed.Once the SEQUENCE already exists in the database, you specify automatic key generation in the XML deployment descriptors. In the weblogic-cmp-rdbms-jar.xml file, you specify automatic key generation as follows: Figure 5-8 Specifying automatic key generation for Oracle<automatic-key-generation> <generator-type>ORACLE</generator-type> <generator_name>test_sequence</generator-name> <key-cache-size>10</key-cache-size></automatic-key-generation>Specify the name of the ORACLE SEQUENCE to be used, using the generator-name element. If the ORACLE SEQUENCE was created with a SEQUENCE INCREMENT value, then you must specify a key-cache-size. This value must match the Oracle SEQUENCE INCREMENT value. If these two values are different, then you will most likely have duplicate key problems.Warning: Do not use the generator type USER_DESIGNATED_TABLE with Oracle, as doing so can cause the following exception:javax.ejb.EJBException: nested exception is: java.sql.SQLException: Automatic Key Generation Error: attempted to UPDATE or QUERY NAMED SEQUENCE TABLE NAMED_SEQUENCE_TABLE, but encountered SQLException java.sql.SQLException: ORA-08177: can't serialize access for this transaction. USER_DESIGNATED_TABLE mode sets the TX ISOLATION LEVEL to SERIALIZABLE which can cause problems with Oracle. Instead, use the AutoKey option ORACLE.
    对于jboss3.2我已知道mysql数据库的做法,却不知道oracle数据库该怎么实现,jbosscmp-jdbc.xml的编写,希望高手能指教!
      

  13.   

    感谢楼上各位的回答,非常感谢!
    to bonhomme:你说任何表都有主键,那我举个例子(当然只是假设),有这样一个表,就三个字段,一个是报警时间,一个是报警地点,一个是报警内容,时间只定位到天,那么请问这个表除了增加一个id(自增)字段外 应该用什么做主键?(同一天同一个地点可以有多条报警)