ojb和hibernate是我用过两个o/r mapping框架,附带说一句,我用ojb比hibernate的时间长多了,因此对hibernate的了解不深,因此有一些看法可能会有误。
备注: ojb网址 http://jakarta.apache.org/ojb
ojb和hibernate的机制基本上是样,没有多的区别,包括代理,约束,引用等, 都可以使用类sql语句,ojb用oql,hibernate用hql,也可以设置查询类,如,
不过 我两者在一个很大的设计的区别。
就是说数据填充上的设计
如
class user
{
private string name;
public void setname(string r_name)
{
name=r_name;
}
public string getname()
{
return name;
}
}
ojb用下列描述符
ojb的引擎将数据库填充到对象时是使用reflection来设置name这个字段,有些象user.name=...
将对象中的数据保存到数据库时,也是这样
hiberate用下列描述符
hibernate的引擎将数据库填充到对象时是使用reflection来设置name这个属性,即调用user.setname(...);
将对象中的数据保存到数据库时,调用user.getname();
(我一向把property看作带操作的field.)
想来 设计者分别采用这种方式,应该有各自的理由,但我个人还是比较喜欢ojb的方式。
原因如下
实体类应该只代表数据库,通过field就可以,使用property进行访问,只是避免以后可能的改动,或者实体类不是单纯的实体类,可以带些简单的业务模型意义里面。因此用field可能会更好一些。
比如说 用ojb的话类可能象这样,getstate返回string,给用户查看,如"冻结帐户","新注册用户"
class user
{
private string name;
private int state;
public void setname(string r_name)
{
name=r_name;
}
public string getname()
{
return name;
}
public void setstate(int r_state)
{
state=r_state;
}
public string getstate()
{
if(...)
return ...;
else
return ...
}
}
用hibernate的类象这样
class user
{
private string name;
private int state;
public void setname(string r_name)
{
name=r_name;
}
public string getname()
{
return name;
}
public void setstate(int r_state)
{
state=r_state;
}
public void getstate()
{
return state;
}
public string getstatestring()
{
if(...)
return ...;
else
return ...
}
}
我总是觉得ojb的看起来更顺眼一些
当然我不是说hibernate不好
不过在一般的中小型程序中,很少有纯粹的实体类,多多少少都带了一点业务,或者因为其它原因,如上面的原因,ojb可能会有点优秀。
闽公网安备 35060202000074号