一,首先需要导入支持注解开发的jar包:
hibernate-annotations.jar
hibernate-commons-annotations.jar (Hibernate中支持注解开发的jar包)
ejb3-persistence.jar(API规范的jar包)
slf4j/slf4j-api-1.5.0.jar
slf4j-log4j12-1.5.0.jar
log4j-1.2.15.jar (支持日志输出的jar包,注意版本的匹配)
二,在Hibernate框架进行注解开发时,主要是代替实体和数据表的映射文件,而核心配置文件中的,数据库的连接等等,还是需要xml配置文件,进行配置的。先看一下Hibernate中常用的注解:
1,@Entity : 表示当前的类为实体类,声明在类的前面。可以将当前类和数据库的表和字段进行关联映射。
2,@Table:表示映射的表,声明在类的前面
3,@Id:表示主键的映射,声明在主键的get方法前边,默认情况下主键利用assigned(用户提供)生成策略。如果想要设置API规范提供了四种主键生成策略:
@GeneratedValue(strategy=GenerationType.AUTO) 相当于Hibernate框架的native主键生成策略
@GeneratedValue(strategy=GenerationType.IDENTITY) 相当于Hibernate框架的identity主键生成策略,适用于MySQL,SQL Server
@GeneratedValue(strategy=GenerationType.SEQUENCE) 相当于Hibernate框架的sequence主键生成策略,适用于Oracle,DB2
@GeneratedValue(strategy=GenerationType.TABLE) 使用一张单表管理主键值。
默认情况下API规范是不支持Hibernate框架中的uuid的主键生成策略,假如我们想要使用,需要我们进行增加主键生成器,如下:
@GenericGenerator(name="hibernate-uuid",strategy="uuid")
@GeneratedValue(generator="hibernate-uuid")
4,@Column : 表示映射属性,和表的字段进行关联
5,@ManyToOne : 表示映射关系中的多对一
6,@JoinColumn : 表示外键映射属性,和表的外键字段进行关联
7,@OneToMany : 表示映射关系中的一对多,这里需要注意,一对多时,外键的维护需要翻转交给多的一方进行维护,需要配置反转属性mappedBy,属性取值为多的一方的映 射属性名称。相当于xml配置文件中的Inverse="true"。
8,@OrderBy : 表示排序字段
9,@Transient : 表示声明瞬时属性,不和数据库的字段发生关联,也就是没有表中列与之映射。
等等吧,其实我感觉这些属性和xml配置文件属性都是一一对应的,及时不一样,也会有与之类似的属性进行实现其功能,所以我们可以对比着使用。当然这里只是一些常用的,当我们需要时还需要我们查看文档进行编写。
三,看一个简单的利用主键开发的实体类吧,这里就不需要我们再编写配置文件了:
package com.lianpay.ams.business.pojo; import java.io.Serializable; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; import org.codehaus.jackson.annotate.JsonIgnore; import com.lianpay.ams.business.enums.AMSEnums.*; /** * 硬件设备实体类 * @author chensy * */ @Entity @Table(name = "dev_detail") public class DevDetail implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Id @Column(name = "dev_serialNO", length = 20) private String devSerialNo; //设备序列号 @Column(name = "dev_IPAddr", length = 20) private String devIPAddr; //IP地址 @Column(name = "dev_type", length = 1) @Enumerated(EnumType.ORDINAL) private DevType devType; //类型 @Column(name = "mem_info", length = 20) private String memInfo; //内存信息 @Column(name = "disk_info", length = 20) private String diskInfo; //硬盘信息 @Column(name = "up_time", length = 10) private String upTime; //上架时间 @Column(name = "os_info", length = 20) private String osInfo; //操作系统 @JsonIgnore @Column(name = "net_area", length = 20) @Enumerated(EnumType.STRING) private NetArea netArea; //网络区域 @Column(name = "phy_area", length = 20) private String phyArea; //物理区域 @Column(name = "cpu_info", length = 20) private String cpuInfo; //CPU信息 //状态 @Column(name = "dev_status", length = 1) @Enumerated(EnumType.ORDINAL) private Status devStatus = Status.NORMAL; @JsonIgnore @OneToMany(targetEntity = HostDetail.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "dev_serialNO") private List<DevDetail> devDetails; public String getDevSerialNo() { return devSerialNo; } public void setDevSerialNo(String devSerialNo) { this.devSerialNo = devSerialNo; } public String getDevIPAddr() { return devIPAddr; } public void setDevIPAddr(String devIPAddr) { this.devIPAddr = devIPAddr; } public String getMemInfo() { return memInfo; } public void setMemInfo(String memInfo) { this.memInfo = memInfo; } public String getDiskInfo() { return diskInfo; } public void setDiskInfo(String diskInfo) { this.diskInfo = diskInfo; } public String getUpTime() { return upTime; } public void setUpTime(String upTime) { this.upTime = upTime; } public String getOsInfo() { return osInfo; } public void setOsInfo(String osInfo) { this.osInfo = osInfo; } public String getPhyArea() { return phyArea; } public void setPhyArea(String phyArea) { this.phyArea = phyArea; } public String getCpuInfo() { return cpuInfo; } public void setCpuInfo(String cpuInfo) { this.cpuInfo = cpuInfo; } public List<DevDetail> getDevDetails() { return devDetails; } public void setDevDetails(List<DevDetail> devDetails) { this.devDetails = devDetails; } public Status getDevStatus() { return devStatus; } public void setDevStatus(Status devStatus) { this.devStatus = devStatus; } public DevType getDevType() { return devType; } public void setDevType(DevType devType) { this.devType = devType; } public NetArea getNetArea() { return netArea; } public void setNetArea(NetArea netArea) { this.netArea = netArea; } }
四,当然用了注解的开发方式,我们的核心配置文件就需要我修改了,这里就需要Hibernate的AnnotationSessionFactoryBean工厂类了,
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 配置自动扫描包下的实体,也可使用annotatedClasses属性进行单个实体配置-->
<property name="packagesToScan">
<list>
<value>com.lianpay.ams.*</value>
</list>
</property>
<!-- 配置Hibernate属性 -->
<property name="hibernateProperties">
<props>
//...省略。。。
</props>
</property>
</bean>