http://blog.csdn.net/chenjyuj/archive/2007/04/11/1561342.aspx
XDoclet in Action 下载地址: http://www.infoxa.com/asp/book/xxnr.asp?id=1570
XDoclet实现基本原理是,通过在Java代码加入特定的JavaDoc tag,从而为其添加特定
的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应
的配置文件,XDoclet。
血的教训,不要用 Key 当作变量名,不然无法自动生成数据库表。
table | 类对应的表名,默认值:当前类名 |
where | 数据甄选条件,如果只需要处理库表中某些特定数据的时候,可通过此选项设定结果集限定条件。 |
dynamic-update | 生成Update SQL时,仅包含发生变动的字段,默认值: false。dynamic-update="true"时,Update SQL 时候,只包括当前发生变化的字段(提高DB Update性能)。 |
dynamic-insert | 生成Insert SQL时,仅包含非空(null)字段,默认值:false。 dynamic-insert="true" 时,Insert SQL 时候,只包括当前非空字段。(提高DB Insert性能) |
discriminator-value | 子类辨别标识,用于多态支持。 discriminator-value="1" discriminator-value 参数的目的是对多态提供支持。请参见下面关于@hibernate.discriminator的说明。 |
Proxy | 代理类,默认值:空。 proxy="" 表明当前类不使用代理(Proxy)。代理类的作用是为Lazy.Loading提供支持 |
lazy | Specifies the class itself to use for CGLIB proxy interface 默认:false lazy =" false " 表示不采用延迟加载 |
@hibernate.discriminator(识别器) 用于提供多态支持。
column | 用于区分各子类的字段名称。默认值:当前类名 |
type | 对应的Hibernate类型 |
length | 字段长度 |
注意下面的例子运行,应该是不能自动生成代码的,要把注释说明文档都删掉才可以,好象跟XDoclet文档有冲突,我以前有次就是写了些注释文档后就会出错。
/** *//** * * @hibernate.class * table="TUser" * dynamic-update="true" * dynamic-insert="true" * * @hibernate.discriminator column="user_type" type="integer" */ public class TUser implements Serializable ...{ ...... } //根类TUser 中,通过@hibernate.discriminator 指定了以"user_type"字段 //作为识别字段。 /** *//** * @hibernate.subclass * discriminator-value="1" */ public class SysAdmin extends TUser ...{ ...... } /** *//** * @hibernate.subclass * discriminator-value="2" */ public class SysOperator extends TUser ...{ ...... } //SysAdmin 和SysOperator 均继承自TUser,其discriminator-value 分别设置 //为"1"和"2",运行期Hibernate 在读取t_user 表数据时,会根据其user_type 字段进行 //判断,如果是1 的话则映射到SysAdmin类,如果是2 映射到SysOperator 类。
@hibernate.subclass ,顾名思义,@hibernate.subclass与@hibernate.class
不同之处就在于,@hibernate.subclass 描述的是一个子类,实际上,这两个Tag
除去名称不同外,并没有什么区别。
/** * title: 论坛中的主帖子 * * @author conkeyn * @时间 2009-3-14:下午11:32:37 * @hibernate.class table="tbl_thread" dynamic-update="true" * dynamic-insert="true" * @hibernate.discriminator column="thread_type" type="string" length="50" */ public class Thread extends DefaultId { /** */ private static final long serialVersionUID = 351051173463817068L; private String title; private String content; private Date addtime; /** * @hibernate.property * @return */ public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } /** * @hibernate.property type="text" * @return */ public String getContent() { return content; } public void setContent(String content) { this.content = content; } /** * @hibernate.property * @return */ public Date getAddtime() { return addtime; } public void setAddtime(Date addtime) { this.addtime = addtime; } /* * (non-Javadoc) * * @see com.conkeyn.common.model.BaseObject#equals(java.lang.Object) */ @Override public boolean equals(Object o) { // TODO Auto-generated method stub return false; } /* * (non-Javadoc) * * @see com.conkeyn.common.model.BaseObject#hashCode() */ @Override public int hashCode() { // TODO Auto-generated method stub return 0; } /* * (non-Javadoc) * * @see com.conkeyn.common.model.BaseObject#toString() */ @Override public String toString() { // TODO Auto-generated method stub return null; } }
/** * title: * @author conkeyn * @时间 2009-3-14:下午11:49:43 * @hibernate.subclass dynamic-update="true" dynamic-insert="true" discriminator-value="c" */ public class Thread_C extends Thread { /** */ private static final long serialVersionUID = 3619991853952314367L; private String js; public String getJs() { return js; } public void setJs(String js) { this.js = js; } }
生成的xml标签:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="domain.Employee" table="t_employee" discriminator-value="0"> <id name="id" column="id" type="java.lang.Long"> <generator class="native" /> </id> <discriminator column="type" type="integer" /> <property name="name" type="java.lang.String" update="true" insert="true" column="name" /> <subclass name="domain.EmployeeSale" discriminator-value="1"> <property name="item" type="java.lang.String" update="true" insert="true" column="item" /> <property name="total" type="java.lang.Integer" update="true" insert="true" column="total" /> </subclass> <subclass name="domain.EmployeeSkill" discriminator-value="1"> <property name="skill" type="java.lang.String" update="true" insert="true" column="skill" /> <property name="level" type="java.lang.Integer" update="true" insert="true" column="level" /> </subclass> </class> </hibernate-mapping>
SQL:
CREATE TABLE `t_employee` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `type` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `item` varchar(255) DEFAULT NULL, `total` int(11) DEFAULT NULL, `skill` varchar(255) DEFAULT NULL, `level` int(11) DEFAULT NULL, PRIMARY KEY (`id`) )
2、使用 joined-subclass
3、联合使用subclass和joined-subclass