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