在HIBERNATE中用什么工具O/R MAPING好?

03-09-11 billylovedog
我们在项目准备用HIBERNATE,但是有一些需要解决!

1。可以用class2hbm和xdoclet对类进行影射,class2hbm主要是用要

LOAD类,然后进行REFLECT,他需要提供UID并且不支持一次处理多个类,

xdoclet是可以一次处理多个类,但是他需要再类中写一些JAVADOC的注释,如果没有的话,好象不能生成XML文件,如果写JAVADOC写错了,估计

也不能生成XML代码,还有什么别的工具可以用啊,还有有没有办法自动给每个字段赋长度啊,难道

每次自动生成后XML,还得自己一个个改么,还有最好HIBERNATE支持

自动建表功能,象JDO一样,本人刚学HIBERNATE,向各位老鸟请教。

robbin
2003-09-11 13:46
谁说Hibernate没有自动建表功能?好好去看看ExportSchema

谁说hbm要写字段长度?根本就不用写!!! 甚至连字段属性都不用写,Hibernate会根据PO的属性的类型自动判断。

billylovedog
2003-09-11 14:24
这ExportSchema我正在用,不过这跟我所说的自动建表有点出入,

JDO里面的自动建表是系统自动完成的,不要显示的调用。

根据hibernate-mapping-2.0.dtd,表的字段是用LENGTH可以设置长度的,

ExportSchema建的表String类型全部是255的长度,比如一个类的NAME

字段应该8个字符就够了,弄得那么长,好象有点不好吧,虽然他的字段

是VARCHAR,。用CLASS2HBM之后还得用手工改。

yehs220
2003-09-11 14:30

<property 
    name="amount" 
    type="big_decimal">
    <column 
        name="AMOUNT" 
        sql-type="NUMERIC(11, 2)"/>
</property>
<p>

robbin
2003-09-11 15:16
varchar长点有什么不对的?看来你还不知道varchar是变长的,填多少数据,就有多长,根本就不会多占空间。

用ExportShema是需要调用一次,这难道很麻烦吗?不过举手之劳,再说你说什么JDO自动建表也是特指某种JDO产品的GUI工具罢了,也不能通用阿。

billylovedog
2003-09-11 15:43
不是的,比如说TJDO的自动建表功能对程序来说,就是透明的。他的表

不是通GUI或者手工建的。Tjdo里面有一个com.triactive.jdo.autoCreateTables=true如果该属性是TRUE的话,

当你插入一条数据的时候,如果数据库里面没有该表TJDO就自动建一个。

不过他不支持事务嵌套,查询的功能远没有HIBERNATE强大。

不过我们用的时候把一些功能封装起来了,比如UPDATE的功能,

先用FOR循环把对象把对象改好,然后保存起来我看有点麻纺,

我们做了一个函数封装了一下使之UPDATE对象想用SQL的UPDATE语句一样,

但是该函数还是有一些缺陷不支持子对象的修改,不知各位有没有好的方法。

robbin
2003-09-11 16:43
我不是盲目的排斥自动建表工具,实际上该功能是非常危险的,这相当于可以透过JDO向数据库发送create table语句,恶意捣乱的人很容易把数据库搞掉。

billylovedog
2003-09-11 16:57
不过JDO没有提供建表的接口给用户,如果用户想建表捣乱的话,那只有通过JDBC去弄了。

刚才我发现了一个有趣的现象,如果父对象关联了一个子对象的话,

必须是SAVE父对象然后再save子对象,其实我认为应该只保存父就够了,

保存了父对象子对象也应该一起保存起来了啊!

you.cai
2003-09-12 16:57
自动更新表结构,可以使用ant,不过,我还没有想好怎么自动更新上次更新数据库后再次更新过的表:(。

你说的现象是hibernate吗?

设置不正确,也应该是先存子对象后存父对象。

估计是你的cascade设置的不正确

you.cai
2003-09-12 16:59
自动更新表结构,可以使用ant,不过,我还没有想好怎么自动更新上次更新数据库后再次更新过的表:(。

你说的现象是hibernate吗?

设置不正确,也应该是先存子对象后存父对象。

估计是你的cascade设置的不正确

billylovedog
2003-09-13 18:57
jdo的自动建表是JDO在程序运行的时候如果发现你的数据库中没有表的话,JDO自动帮你建的,不是通过用户外部来实现的。

存父子对象的时候,应该只需要保存父对象就够了,子对象只要被父

对象设置之后,保存了父对象应该同样的保存了子对象。JDO就是这样的

实现的。

robbin
2003-09-13 19:14
>>do的自动建表是JDO在程序运行的时候如果发现你的数据库中没有表的话,JDO自动帮你建的

这个功能非常危险。

billylovedog
2003-09-13 20:53
to robbin

为什么呢?能给点详细的解释么?但是我认为这是个非常好的功能,如果

我们进行数据库的移植的话,对于我们的应用程序来说只要提供物理数据库就行了,非常方便的。当然JDO支持VIEW,支持存储过程的调用,但是

不能建存储过程。还有JDO建表不是乱建表,他是根据*。JDO文件来建表,

*。JDO类似于*。HBM。XML,他实际上也是一个XML文件,可以定义一对一

一对多,多对多等关系,JDO还有一个与HIBERANTE不同的地方,那就是

JDO在运行的时候不需要*。JDO文件了,但是HIBERANTE在运行还需要

*。HBM。XML文件,也许这也没什么的,但是我认为依赖的东西越多,出错

的概率就越大。

还有,我现在在看HIBERNATE的源码,他的源码写得不错,比较容易懂,

更新的速度很快,不象JDO的规范吵来吵去,弄个半天还没弄出来,但是

人家到底是SUN,牛当然牛一点啦。

有什么不懂的地方还得想您请教。

robbin
2003-09-13 21:19
你到Hibernate中文论坛去我们可以更详细的讨论 Hibernae vs JDO的问题。

这里简单的回复一下:

在程序中建表是有安全隐患的。这是一个数据库范畴的问题,一般来说程序中连接数据库的用户权限是很低的只有CRUD的权限,来保证恶意代码不能对数据库进行破坏。为了支持程序中建表必须扩大用户权限,使用户具备了DML语句的运行能力,那么恶意代码将有可能造成数据库表的被删除。

Hibernate是在初始化的时候读入hbm配置文件,运行过程中并不需要。详细分析这个问题就要涉及到PO的生成问题了。你可以看看Hibernate中文论坛有一个我对JDO的分析,简单来说,JDO是手工用Enhancer来生成PO,所以运行期可能不需要jdo配置文件,而Hibernate是运行期动态生成PO,所以在初始化的时候需要hbm。而运行期动态生成PO的好处是非常大的。

billylovedog
2003-09-13 22:05
to rabbin

你的恶意代码是怎么理解的。就算程序员要故意写一些恶意代码,但是他

把这些代码怎么通过JDO来执行呢,换句话说,JDO根本就没有提供操作

DML的接口,他和HIBERNATE一样也只是提供查询,修改,插入等操作。

我去看一下你的HIBERNATE VS JDO文章。

猜你喜欢