首页 | 公告 | 参考资料  | 教程 | 框架/设计 | 源码/下载 | 构件产品 | MyRSS | 博客 
简易java开源论坛->项目发布
  版主:船长
 版面公告:发布并探讨EasyJF开源团队的各种开源产品.
搜索 文章标题: 发表人:
[回复] [精华帖] [版主管理]
 主题:关于EasyDBO的一点问题 [收藏]
  [引用回复]

我们用里面的例子product和provider表来说明
如果一个provider拥有A、B两个product,那中间表就有两条对应的记录
如果这个provider现在要拥有C这个product,那么只能是直接对中间表进行插入操作,而不能通过查询出provider,然后在多对多关系的List中加入C,从而进行更新中间表。
也就是说,EasyDBO没有提供多对多关系表数据的更新方法。
我采用的是注解标签形式进行映射.
 楼主:一品 Thu Oct 26 18:03:30 CST 2006
 
  [引用回复]

你不是没有配置对?还是按照示例来的。我使用配置文件的方式测试是正常的!

摘一段开发文档中关于多对多的描述:

  在上面的所示的关系中,一个Provider可以供应多种产品,同一个产品Product也可以由多个供应商供应。因此,产品Product与供应商Provider之间是多对多的关系。在EasyDBO中,我们通过下面配置文件来表示这种关系!

  <class name="com.easyjf.dbo.example.Product" table="product" schema="dbo" catalog="easyjf" lazy = "false">
    <id name="cid" type="string">
      <column name="cid" length="16" not-null="true" />
      <generator class="com.easyjf.dbo.IdGenerator" />
    </id>
    <many-to-many name="providers" fieldType="java.util.List" type="com.easyjf.dbo.example.Provider" tableName="providerproduct" column="productId" key="cid" tagColumn="providerName" tagKey="userName">
    </many-to-many>
    ...
  </class>
  <class name="com.easyjf.dbo.example.Provider" table="Provider" schema="dbo" catalog="easyjf" lazy = "false">
    <many-to-many name="prdoucts" fieldType="java.util.List" type="com.easyjf.dbo.example.Product" tableName="providerproduct" column="providerName" key="userName" tagColumn="productId" tagKey="cid">
    </many-to-many>
    ...
  </class>

  在上面的配置文件中:
  name-表示存在多对多关系的属性名;

  filedType-表示属性的类型,即集合或数组等微容器类型;

  type-表示关联对象的实际类型,即微容器中的元素类型;

  tableName-表示中间表名;

  columan-表示关联表中跟本对象对应的字段名称;

  key-表示关联表中代表本对象的属性名称;

  tagColumn-表示关联目标对象的字段名称;

  tagKey-表示关系目标对象的属性名称。
  在以上属性中,除了filedType可以缺省以外,其它的属性都是必须设置的。
 发言人:大峡 楼层:1  2006-10-26 09:21:10.223
 
  [引用回复]

另外问一下,你测试插入、读取、及删除对不对呢?
 发言人:大峡 楼层:2  2006-10-26 09:39:24.093
 
  [引用回复]

插入、读取、删除都可以
我可能没有描述清楚
我的意思是,如果product里面已经有了A、B、C三种产品,
而甲的资料也存在了provider表中,目前甲有A、B两种产品,即providerproduct表中
有如下两条记录:
甲  A
甲  B
如果现在想增加
甲  C
这条记录,那如何操作?是不是先从provider表中取得甲,在从provider中取得C,然后再直接用sql语句插入providerproduct表中?
我想能不能用类似如下语句更新providerproduct表:
EasyJDB db = EasyJDB.getInstance();
Collection paras = new ArrayList();
paras.add("甲");
Provider provi = (Provider )db.read(Provider.class,"username=?",paras);
List productList= provi.getProducts();//取得产品列表
paras.clear();
paras.add("c");
Product prod = (Product)db.read(Product.class,"cid=?",paras);
productList.add(prod);
db.updateRelative(provi);//删除原关系,重新更新中间表
db.close();
 发言人:一品 楼层:3  2006-10-26 10:46:37.703
 
  [引用回复]

另外问一下大峡先生,您用过java5注解标签的方式进行测试过么?
配置文件和注解标签哪种效率高?
 发言人:一品 楼层:4  2006-10-26 10:49:24.047
 
  [引用回复]

效率来说两种方式都差不多的,所有的代码我们都经过了测试通过的!
 发言人:天意 楼层:5  2006-10-26 13:04:33.143
 
  [引用回复]

插入、读取、删除都可以
我可能没有描述清楚
我的意思是,如果product里面已经有了A、B、C...

我在注解下面测试过,不过可能没测试修改,呵呵。
关于您写的这部分代码:
Product prod = (Product)db.read(Product.class,"cid=?",paras);
productList.add(prod);
db.updateRelative(provi);//删除原关系,重新更新中间表

因为不准备把updateRelative方法给一般客户端调用,所以不建议使用该方法。我们比较推荐的用法是:
EasyJDB db = EasyJDB.getInstance();
Collection paras = new ArrayList();
paras.add("甲");
Provider provi = (Provider )db.read(Provider.class,"username=?",paras);
List productList= provi.getProducts();//取得产品列表
Product prod = (Product)db.read(Product.class,"cid=?",paras);
productList.add(prod);
db.update(provi);
//只需要db.update这一句即可,EasyDBo应该要把相关的对象更新,包括把新加prod插入到关联表中。
也可以把db.update(provi);改成
db.saveOrUpdate(provi);

一对多、多对多这一块测试得还不够,所以我现在也不敢100%保证。
还请多试试!等这段时间忙完,多搜集一些大家的建议,下个月中下旬争取出1.0版本。
 发言人:大峡 楼层:6  2006-10-26 14:34:37.713
 
  [引用回复]

我也希望用db.update(provi)或者用db.saveOrUpdate(provi)更新关联表
但目前update和saveOrUpdate好像都无法完成这种功能
我测试过,都会出现错误
 发言人:一品 楼层:7  2006-10-26 15:55:48.75
 
  [引用回复]

刚才看了一下源码,确实在update的时候没有更新关联表!

EasyJDB中的update方法如下:
   public boolean update(Object obj) {
       logger.info("更新持久层中的数据表对象");
       return dbEngine.update(obj2dbo(obj));
   }

要改新关联表,需要把update方法改一下,如下:
   public boolean update(Object obj) {
       logger.info("更新持久层中的数据表对象");
       boolean ret= dbEngine.update(obj2dbo(obj));
       ret=ret&this.addRelativeObject(obj);
       return ret;
   }

  只有通过addRelativeObject方法处理的才能更新关联表。不过这个方法只是解决了添加或修改,没有处理删除的情况,这个需要再调整。
  争取下一版调好!可以到SVN取最新代码
 发言人:大峡 楼层:8  2006-10-26 16:56:05.32
 
  [引用回复]

还有一个问题请问一下
在级联更新的时候,
cache里面会不会有不一致的问题??
 发言人:211.95.168.253 楼层:9  2006-10-26 17:46:26.35
 
  [引用回复]

级联更新不是直接生成SQL语句执行,而是通过EasyJDB的del及saveOrUpdate两个方法来针对Domain Object完成的。所以cache里数据应该是一致的。
 发言人:大峡 楼层:10  2006-10-26 18:03:30.397
10条回复 共1页,目前为第1 分页: 
[精华帖] [刷新]
 请在下面输入回复信息

表情图片
(加入心情图标)



内容:
相关图片: 各图片之间用逗号隔开
相关附件: 各附件之间用逗号隔开
用户名: 您还没有[ 注册]或[登录
 

Aboutus | 联系我们 | 程序开发 | 网站地图 | 留言板