隨筆-35  評論-97  文章-0  trackbacks-0

          用著用著,突然發覺EasyDBO并沒有實現到它聲稱的功能。

          如,當你的實體有一對一關聯或者一對多等關聯時,它并沒有能夠正確地處理外鍵值(當關聯的主鍵為自增類型時,插入關聯對象獲取到外鍵為空,被關聯的對象雖然能插入,但是這樣有舍用呢?)。

          看看它處理的過程就知道它不能正確出來外鍵值了。

          舉個具體的例子吧。

          關聯實體:

          @Table(tableName="customer",keyField="cid",keyGenerator="com.easyjf.dbo.NullIdGenerator")
          public class Customer implements Serializable {

            
          //EasyJWeb Tools自動代碼生成
            
          //屬性部份

              
          /**
               * 
               
          */

              
          private static final long serialVersionUID = 1L;

              @TableField(name
          ="cid")
              
          private String cid;
            
              @TableField(name
          ="userName")
              
          private String username;
            
              @TableField(name
          ="password")
              
          private String password;
            
              @TableField(name
          ="email")
              
          private String email;
            
              @TableField(name
          ="tel")
              
          private String tel;
            
              @TableField(name
          ="birthday")
              
          private Date birthday;
            
              @TableField(name
          ="intro")
              
          private String intro;
              
              @OneToOne(column
          ="messageId",tableName="message",type=Message.class,key="cid")
              
          private Message message;
              @ManyToOne(column
          ="messageId",tableName="",type=Message.class,key="cid")
              
          private List<Message> massages;

          //getter及setter方法

               
          public String getCid() {
                  
          return cid;
              }


              
          public void setCid(String cid) {
                  
          this.cid = cid;
              }

                
          public String getUsername() {
                  
          return username;
              }


              
          public void setUsername(String username) {
                  
          this.username = username;
              }

                
          public String getPassword() {
                  
          return password;
              }


              
          public void setPassword(String password) {
                  
          this.password = password;
              }

                
          public String getEmail() {
                  
          return email;
              }


              
          public void setEmail(String email) {
                  
          this.email = email;
              }

                
          public String getTel() {
                  
          return tel;
              }


              
          public void setTel(String tel) {
                  
          this.tel = tel;
              }

                
          public Date getBirthday() {
                  
          return birthday;
              }


              
          public void setBirthday(Date birthday) {
                  
          this.birthday = birthday;
              }

                
          public String getIntro() {
                  
          return intro;
              }


              
          public void setIntro(String intro) {
                  
          this.intro = intro;
              }


              
          public Message getMessage()
              
          {
                  
          return message;
              }


              
          public void setMessage(Message message)
              
          {
                  
          this.message = message;
              }


              
          public List<Message> getMassages()
              
          {
                  
          return massages;
              }


              
          public void setMassages(List<Message> massages)
              
          {
                  
          this.massages = massages;
              }

              
            }

           

          被關聯實體:

           

          @Table(tableName="message",keyField="cid",keyGenerator="com.easyjf.dbo.NullIdGenerator")
          public class Message implements Serializable {
              
              
          private static final long serialVersionUID = 1L;

              @TableField(name
          ="cid")
              
          private Long cid;
            
              @TableField(name
          ="title")
              
          private String title;
            
              @TableField(name
          ="content")
              
          private String content;
            
              @TableField(name
          ="inputUser")
              
          private String inputuser;
            
              @TableField(name
          ="inputTime")
              
          private java.util.Date inputtime;
            
              @TableField(name
          ="publish")
              
          private Integer publish;
            
              @TableField(name
          ="status")
              
          private Integer status;

               
          public Long getCid() {
                  
          return cid;
              }


              
          public void setCid(Long cid) {
                  
          this.cid = cid;
              }

                
          public String getTitle() {
                  
          return title;
              }


              
          public void setTitle(String title) {
                  
          this.title = title;
              }

                
          public String getContent() {
                  
          return content;
              }


              
          public void setContent(String content) {
                  
          this.content = content;
              }

                
          public String getInputuser() {
                  
          return inputuser;
              }


              
          public void setInputuser(String inputuser) {
                  
          this.inputuser = inputuser;
              }

                
          public java.util.Date getInputtime() {
                  
          return inputtime;
              }


              
          public void setInputtime(java.util.Date inputtime) {
                  
          this.inputtime = inputtime;
              }

                
          public Integer getPublish() {
                  
          return publish;
              }


              
          public void setPublish(Integer publish) {
                  
          this.publish = publish;
              }

                
          public Integer getStatus() {
                  
          return status;
              }


              
          public void setStatus(Integer status) {
                  
          this.status = status;
              }

            }

           

          測試:

          public class Test
          {
              
          public static void main(String[] args)
              
          {
          //        addAData();
                  addDatas();
              }

              
              
          public static void addDatas(){
                  EasyJDB db
          =EasyJDB.getInstance();
                  db.setAutoCommit(
          false);
                  Customer customer 
          = new Customer();
                  customer.setUsername(
          "sometwo");
                  customer.setBirthday(
          new Date());
                  customer.setIntro(
          "某某人");
                  customer.setCid(System.currentTimeMillis()
          +"");
                  
                  Message message1 
          = new Message();
                  message1.setTitle(
          "a message");
                  message1.setContent(
          "某某信息.");
                  message1.setInputtime(
          new Date());
                  
                  Message message2 
          = new Message();
                  message2.setTitle(
          "another message");
                  message2.setContent(
          "另某某信息.");
                  message2.setInputtime(
          new Date());
                  List
          <Message> list = new ArrayList<Message>();
                  list.add(message1);
                  list.add(message2);
                  
                  customer.setMassages(list);
                  db.add(customer);
                  db.commit();
                  db.close();
              }

              
              
          public static void addAData(){
                  EasyJDB db
          =EasyJDB.getInstance();
                  db.setAutoCommit(
          false);
                  Customer customer 
          = new Customer();
                  customer.setUsername(
          "someone");
                  customer.setBirthday(
          new Date());
                  customer.setIntro(
          "某人");
                  customer.setCid(System.currentTimeMillis()
          +"");
                  
                  Message message1 
          = new Message();
                  message1.setTitle(
          "a message");
                  message1.setContent(
          "某某信息.");
                  message1.setInputtime(
          new Date());
                  customer.setMessage(message1);
                  
                  db.add(customer);
                  db.commit();
                  db.close();
              }

          }

           

          調試信息輸出:

          EasyDBO:insert into customer(password,userName,intro,email,tel,cid,birthday) values(?,?,?,?,?,?,?)
          EasyDBO:insert into message(inputUser,title,content,status,inputTime,cid,publish) values(
          ?,?,?,?,?,?,?)
          EasyDBO:insert into message(inputUser,title,content,status,inputTime,cid,publish) values(
          ?,?,?,?,?,?,?)

          數據庫的結果是,記錄插入數據庫了,只是對應的外鍵(customer表的messageId為空!這個是致命bug啊!)

          看,調試信息反映出來的對象持久化順序是先插入關聯對象customer,然后再插入被關聯對象message(或者集合messages)。

          當插入customer時,它去獲取被關聯對象的主鍵,即message.id,但是message此時為空!customer數據庫表的messageId字段只能為空了。

          當插入被關聯對象message時,由于id是自增型的,它只能在數據庫里完成id的填充,但是當整條記錄插入后,它又沒有同message對象關聯起來,即沒有hibernate所說的狀態轉換(游離狀態等)。

          然后就完了,不負責地留下未完成的數據持久使命......

          要填補這個bug,簡單的辦法就是將插入對象的順序調過來,即先插入被關聯對象(message),將生成的主鍵回傳給對象,再插入關聯對象(customer)。應該可以吧,想法如此,還沒有作修改實現。

          這么多bug,想放棄用EasyDBO了,連生成代碼工具都寫好了,卻在這時放棄........真不夠意思~~~~~~

          持久層,還是jpa吧.......國產的開源啊,要負責一些,爭氣些,不是不想支持,而是實在.........

          posted on 2007-06-28 23:10 三告習習 閱讀(1232) 評論(4)  編輯  收藏 所屬分類: easyJF-projects

          評論:
          # re: [EasyDBO] 太多另人失望的地方了...... 2007-06-29 08:32 | dennis
          不好,就去提交bug,而不是抱怨,畢竟開源不僅僅是那些貢獻者的事情  回復  更多評論
            
          # re: [EasyDBO] 太多另人失望的地方了...... 2007-06-29 09:47 | 三告習習
          @dennis
          其實也不是抱怨,因為用不用終究是自己的事情。如果能修正這些bug,我也會放上來共享。
          謝謝dennis提醒,不過用了一下發現這么多bug的確感覺不是那么爽......  回復  更多評論
            
          # re: [EasyDBO] 太多另人失望的地方了...... 2007-07-16 20:58 | 小雨
          EasyDBO解決簡單的問題很是很高效的,就像Rails中的ActiveRecord一樣,不過現在的問題確實是比較多的,不適合在大型的項目中使用。  回復  更多評論
            
          # re: [EasyDBO] 太多另人失望的地方了...... 2008-04-10 13:10 | liangzeng
          用什么EasyDBO,用hibernate 多好啊  回復  更多評論
            
          主站蜘蛛池模板: 乌恰县| 余庆县| 惠来县| 喀喇沁旗| 类乌齐县| 黎川县| 湄潭县| 聂荣县| 伊宁市| 康马县| 丰镇市| 长武县| 当阳市| 汉沽区| 滦平县| 镇康县| 周口市| 二手房| 嘉鱼县| 乐亭县| 白玉县| 南皮县| 陆川县| 耿马| 漳浦县| 扎囊县| 屯留县| 泰顺县| 北海市| 靖州| 鲜城| 河津市| 北宁市| 讷河市| 木兰县| 东光县| 海晏县| 剑河县| 忻城县| 全椒县| 邯郸县|