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

我们在项目准备用HIBERNATE,但是有一些需要解决!
1。可以用class2hbm和xdoclet对类进行影射,class2hbm主要是用要
LOAD类,然后进行REFLECT,他需要提供UID并且不支持一次处理多个类,
xdoclet是可以一次处理多个类,但是他需要再类中写一些JAVADOC的注释,如果没有的话,好象不能生成XML文件,如果写JAVADOC写错了,估计
也不能生成XML代码,还有什么别的工具可以用啊,还有有没有办法自动给每个字段赋长度啊,难道
每次自动生成后XML,还得自己一个个改么,还有最好HIBERNATE支持
自动建表功能,象JDO一样,本人刚学HIBERNATE,向各位老鸟请教。

谁说Hibernate没有自动建表功能?好好去看看ExportSchema
谁说hbm要写字段长度?根本就不用写!!! 甚至连字段属性都不用写,Hibernate会根据PO的属性的类型自动判断。

这ExportSchema我正在用,不过这跟我所说的自动建表有点出入,
JDO里面的自动建表是系统自动完成的,不要显示的调用。
根据hibernate-mapping-2.0.dtd,表的字段是用LENGTH可以设置长度的,
ExportSchema建的表String类型全部是255的长度,比如一个类的NAME
字段应该8个字符就够了,弄得那么长,好象有点不好吧,虽然他的字段
是VARCHAR,。用CLASS2HBM之后还得用手工改。



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

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

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

不是的,比如说TJDO的自动建表功能对程序来说,就是透明的。他的表
不是通GUI或者手工建的。Tjdo里面有一个com.triactive.jdo.autoCreateTables=true如果该属性是TRUE的话,
当你插入一条数据的时候,如果数据库里面没有该表TJDO就自动建一个。
不过他不支持事务嵌套,查询的功能远没有HIBERNATE强大。
不过我们用的时候把一些功能封装起来了,比如UPDATE的功能,
先用FOR循环把对象把对象改好,然后保存起来我看有点麻纺,
我们做了一个函数封装了一下使之UPDATE对象想用SQL的UPDATE语句一样,
但是该函数还是有一些缺陷不支持子对象的修改,不知各位有没有好的方法。

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

不过JDO没有提供建表的接口给用户,如果用户想建表捣乱的话,那只有通过JDBC去弄了。
刚才我发现了一个有趣的现象,如果父对象关联了一个子对象的话,
必须是SAVE父对象然后再save子对象,其实我认为应该只保存父就够了,
保存了父对象子对象也应该一起保存起来了啊!

自动更新表结构,可以使用ant,不过,我还没有想好怎么自动更新上次更新数据库后再次更新过的表:(。
你说的现象是hibernate吗?
设置不正确,也应该是先存子对象后存父对象。
估计是你的cascade设置的不正确

自动更新表结构,可以使用ant,不过,我还没有想好怎么自动更新上次更新数据库后再次更新过的表:(。
你说的现象是hibernate吗?
设置不正确,也应该是先存子对象后存父对象。
估计是你的cascade设置的不正确

jdo的自动建表是JDO在程序运行的时候如果发现你的数据库中没有表的话,JDO自动帮你建的,不是通过用户外部来实现的。
存父子对象的时候,应该只需要保存父对象就够了,子对象只要被父
对象设置之后,保存了父对象应该同样的保存了子对象。JDO就是这样的
实现的。

>>do的自动建表是JDO在程序运行的时候如果发现你的数据库中没有表的话,JDO自动帮你建的

这个功能非常危险。

to robbin
为什么呢?能给点详细的解释么?但是我认为这是个非常好的功能,如果
我们进行数据库的移植的话,对于我们的应用程序来说只要提供物理数据库就行了,非常方便的。当然JDO支持VIEW,支持存储过程的调用,但是
不能建存储过程。还有JDO建表不是乱建表,他是根据*。JDO文件来建表,
*。JDO类似于*。HBM。XML,他实际上也是一个XML文件,可以定义一对一
一对多,多对多等关系,JDO还有一个与HIBERANTE不同的地方,那就是
JDO在运行的时候不需要*。JDO文件了,但是HIBERANTE在运行还需要
*。HBM。XML文件,也许这也没什么的,但是我认为依赖的东西越多,出错
的概率就越大。
还有,我现在在看HIBERNATE的源码,他的源码写得不错,比较容易懂,
更新的速度很快,不象JDO的规范吵来吵去,弄个半天还没弄出来,但是
人家到底是SUN,牛当然牛一点啦。
有什么不懂的地方还得想您请教。

你到Hibernate中文论坛去我们可以更详细的讨论 Hibernae vs JDO的问题。

这里简单的回复一下:

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

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

to rabbin
你的恶意代码是怎么理解的。就算程序员要故意写一些恶意代码,但是他
把这些代码怎么通过JDO来执行呢,换句话说,JDO根本就没有提供操作
DML的接口,他和HIBERNATE一样也只是提供查询,修改,插入等操作。
我去看一下你的HIBERNATE VS JDO文章。