用著用著,突然發覺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