通過Hibernate項目中提供的幾個命令行工具(他們也被當作項目的一部分不斷得到維護),還有XDoclet,Middlegen和AndroMDA內置的對Hibernate的支持,可以在幾個不同的環境(SQL,java代碼,xml映射文件)中進行相互轉換(roundtrip)。
Hibernate的主發行包中附帶了最重要的工具(甚至在Hibernate內部也可以快速調用這個工具):
從映射文件到DDL schema的生成器(也就是SchemaExport和hbm2ddl)
Hibernate項目直接提供的其他工具在一個單獨的發行包中發布,Hibernate Extensions。這個發行包包含了下列任務的工具:
從映射文件到Java源代碼的生成器(也就是CodeGenerator,hbm2java)
從已編譯的Java類或者帶有XDoclet標記的Java源代碼生成映射文件(它們是MapGenerator,class2hbm)
實際上Hibernate Extensions里面還有一個工具:ddl2hbm。但是它已經被廢棄了,已經不再被維護了。Middlegen完成了同樣的任務,并且更加出色。
對Hibernate提供支持的第三方工具有:
Middlegen (從現有的數據庫schema中生成映射文件)
AndroMDA ( 使用MDA思想(Model-Driven Architecture ,模型驅動體系)的代碼生成器,它從UML圖和其XML/XMI等價形式中生成持久化類的代碼)
這些第三方工具沒有在這篇指南中說明。請查閱Hibernate 網站得到關于它們目前的情況。(Hibernate主發行包中有關于整個網站的快照)
可以從你的映射文件使用一個命令行工具生成DDL。在Hibernate主發行包的hibernate-x.x.x/bin目錄下有一個批處理文件。
生成的schema包含有對實體和集合類表的完整性引用約束(主鍵和外鍵)。涉及到的標示符生成器所需的表和sequence也會同時生成。
在使用這個工具的時候,你必須 通過hibernate.dialet屬性指定一個SQL方言(Dialet)。
很多Hibernate映射元素定義了一個可選的length屬性。你可以通過這個屬性設置字段的長度。 (假如是Or, for numeric/decimal data types, the PRecision.)
有些tag接受not-null屬性(用來在表字段上生成NOT NULL約束)和unique屬性(用來在表字段上生成UNIQUE約束)。
有些tag接受index屬性,用來指定字段的index名字。unique-key屬性可以對成組的字段指定一個組合鍵約束(unit key constraint)。目前,unique-key屬性指定的值并不會被當作這個約束的名字,它們只是在用來在映射文件內部用作區分的。
示例:
<property name="foo" type="string" length="64" not-null="true"/><many-to-one name="bar" foreign-key="fk_foo_bar" not-null="true"/><element column="serial_number" type="long" not-null="true" unique="true"/>
另外,這些元素還接受<column>子元素。在定義跨越多字段的類型時非凡有用。
<property name="foo" type="string"><column name="foo" length="64" not-null="true" sql-type="text"/></property><property name="bar" type="my.customtypes.MultiColumnType"/><column name="fee" not-null="true" index="bar_idx"/><column name="fi" not-null="true" index="bar_idx"/><column name="fo" not-null="true" index="bar_idx"/></property>
sql-type屬性答應用戶覆蓋默認的Hibernate類型到SQL數據類型的映射。
check屬性答應用戶指定一個約束檢查。
<property name="foo" type="integer"><column name="foo" check="foo > 10"/></property><class name="Foo" table="foos" check="bar < 100.0">...<property name="bar" type="float"/></class>
新聞熱點
疑難解答