我来说几句吧,可能不一定对1.create()方法其实就是在数据库创建一条数据,所以需要的参数要符合数据库的要求,否则会报错。
2.这个问题可以通过设置事务的隔离级别来解决。还有findByPrimaryKey()的代码,应该是写在容器帮你产生的entity bean object的实现类里面。

解决方案 »

  1.   

    关于你说的第二点我想发表一下自己的愚见,J2EE的核心其实RMI,所有的RMI都是线程安全的,所以应该不存在你所说的问题
      

  2.   

    1>看数据库的主键约定,和NULL的控制了。如果都允许也可以。
    2>这就是事务要解决的问题。
    3》findByPrimaryKey不需要任何代码就是根据主见取出数据库中的数据,当然也就是一条记录。
      

  3.   

    看了你给我发的消息,我也来凑凑热闹,先声明我也不是高手,我还没毕业:(1.一个Entity Bean的实例对应的是数据库中的一条记录,这个没问题。如果你调用create()创建一个实例,就等于是在数据库中增加一条记录。但是数据库中增加记录是要有条件约束的,主键约束,非空约束等等,如果你的这条记录违背了约束,系统会抛异常出来的。2.这种情况是不应该出现的。虽然在外面看来用户A和B是一起在操作,但是在计算机内部这个操作是有先后顺序的。拿Weblogic来说,它有一个实例池,一般最大值是默认5个,有用户生成一个实例,实例池中就增加一个实例。在多用户的情况下,如果都是对实例进行查询的操作,没问题;如果有写操作,那就要加锁了。比如A先得到这个权力,它就要加一个独占锁,避免其他用户使用这个实例;只有当A对实例操作结束以后,解锁,然后B获得资源,B对其加锁,开始操作,……3.这个方法是一个默认的方法,作用和他的名字一样,依靠主键从数据库中取数,应该是不需要代码的。PS:再说两句,楼主可以自己试试,看书看不懂,自己试着做做看啊。比如像第一个问题,自己随便建一个表,再键一个entity bean,试一下,印象比看书深刻多了。
      

  4.   

    每调用一次 Create 方法就是创建记录, 如果你的这个函数一般是针对 数据库表中的字段的, 我还没见过使用 无参数的 Create 方法呢, 如果不能创建记录的话肯定是写错误.两个客户机调用了相同的xxx.narrow(xxx,xxx.class), 并不是对同一个 EJB 进行操作, 而是各自生成了 Home 接口(不是 EntityBean), 如果各自同时调用 findByPrimaryKey 方法(或其他 find, select方法)找到“同一个”(主键值相同) EJB 才会有事务的问题。另外 EntityBean 不是靠什么 get set 方法操作数据库的, 操作数据库的语句其实是Create, remove, findByPrimary, 其他find select 方法等
      

  5.   

    我来说说,交流并学习:
    1、大家讲的很清楚。
    2、《master ejb》第三章“资源和服务”第八章“事务”讲的再清楚不过了看这些肯定比我的转述更好。
    3、好象大家说的不清楚
    BMP 中 findByXxx 方法要在Bean类中用数据库操作具体实现。这就是说你自己的程序实现查询。
    CMP 中 在home 接口声明即可,然后要在ejb部署配置文件里配置,告诉应用服务器怎么完成你的这个查询。比如对于jboss,有jaws.xml部署文件,
    <finder>
      <name>findByCreIdAndFurId</name>
      <query>cre_id={0}and fur_id={1}</query>
      <order></order>
      <read-ahead>true</read-ahead>
    </finder>
    这样是你告诉应用服务器让它帮你实现查询。
    我认为这和是否为主键无关更和你起什么名字无关。 另外:set方法改变bean类中一个属性时,如果这个属性是和数据库字段是匹配的(匹配方法也是分bmp和cmp两种),那set方法一样可以改变数据库中的值。
      

  6.   

    是的
    好像除了FINDBYPRIMARYKEY()不用写代码,其余在.JAVA文件中不用写,但是要在部署文件中说明.就像楼上的说的那样