`
conkeyn
  • 浏览: 1506197 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

XDoclet - discriminator标签

阅读更多

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  当作变量名,不然无法自动生成数据库表。

@hibernate.class  

 

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   

@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

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics