前些时候写了篇Hibernate的基本原理与技术实现,现在就来说说hibernate里头一些常用的技术应用,欢迎吐槽!
一、对象映射,针对一个实体,通过hibernate 建立与关系数据库的映射关联,有两种方式。
1)、一个实体Article.java ,可以建立一个单独映射文件 Article.hbm.xml,Hibernate的基本原理一文中已有列子,可自行查看。
package com.hibernate.test;
//读取 *.cfg.xml文件生成数据库表
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB{
public static void main(String[]args){
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//根据读取到的配置文件在数据库中完成建表
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}
2)、通过给给实体添加注解的方式,达到建立映射的目的。
package com.hibernate.test;
//根据实体类中的注解配置,生成数据库表
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB{
public static void main(String[]args){
//默认读取hibernate.cfg.xml文件
Configuration cfg = new AnnotationConfiguration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}
注意:hibernate 4.0 之后AnnotationConfiguration给丢弃了,增加了 ServiceRegistry接口;
Hibernate4.1已经可以自动建表,所以开发时只需要在实体中配置好注解就OK。不需要考虑怎么建表。不需要提前建立 ExportDB 工具去提起建表。
配置注解的实体:详细的注解使用,就得各位看官仔细去看相关文档了Configuration cfg = new Configuration(); ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); SessionFactory sf = cfg.configure().buildSessionFactory(serviceRegistry);
/**
* 系统用户扩展信息
*
* $Autuor$
*/
@Entity
@Table(name = "ERP_SYSTEM_ACCOUNT_EXTENSION")//注解数据库中的表名
public class AccountExtension {
/**
* 数据权限级别.
*/
private Integer dataLevel;
@Column(name = "F_DATA_LEVEL")//注解对应数据库中的字段名
public Integer getDataLevel() {
return this.dataLevel;
}
public void setDataLevel(final Integer dataLevel) {
this.dataLevel = dataLevel;
}
}
二、对象关联映射
1)、一对多,多对一 : CommodityInfo( 一对多 ) CommoditySubInfo,实现方式分两种(实体注解,配置 *.hbm.xm 文件l)
——————————————————————————————————
CommodityInfo实体中的注解:主键CommodityInfo_id
@OneToMany(mappedBy = "commodityInfo")
public List<CommoditySubInfo> getCommoditySubInfo() {
return commoditySubInfo;
}
public void setCommoditySubInfo (List<CommoditySubInfo> commoditySubInfo) {
this.commoditySubInfo = commoditySubInfo;
}
CommoditySubInfo实体中的注解:主键 CommoditySubInfo_id
@ManyToOne
@JoinColumn(name = "F_COMMODITY_INFO" )
public CommodityInfo getCommodityInfo() {
return commodityInfo;
}
public void setCommodityInfo(CommodityInfo commodityInfo) {
this.commodityInfo = commodityInfo;
}
在注解中 mappedBy = "commodityInfo" 表示所在该表为从表,关系的维护在 commodityInfo元素所在的 CommoditySubInfo 表;
在数据库中的sql 语句体现:在CommoditySubInfo 表中建立了一个外键 F_COMMODITY_INFO,用于关联到 CommodityInfo表的主键 CommodityInfo_id
————————————————————————————————
CommodityInfo.hbm.xml 文件
<set name="commoditySubInfo" inverse="true" cascade="all">
<key column="CommoditySubInfo_id"></key>
<one-to-many class="com.bean.CommoditySubInfo"></one-to-many>
</set>
CommoditySubInfo.hbm.cml 文件
<many-to-one name="commodityInfo" class="com.bean.CommodityInfo"
column="CommodityInfo_id" not-null="true" cascade="all"></many-to-one>
在配置中:name表示在该表中的元素
以上两种方式都可以建立一对多的关系