注解可以替换复杂的hbm.xml文件,使得程序的开发大大简化
@Override :子类重写父类方法
@Test :junit测试
@Before :测试之前执行
@SuppressWarnings :防止代码报黄
@Entity :标识实体类(被持久化)
@Table :DB层表的名称
@Transient :不持久化某个属性
@Column:数据表中的字段名
@GenerateValue :主键生成策略
Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射。
在Hibernate3.3之前,需单独下载注解开发包。
配置持久化类方式:
@GeneratedValue指定了标识符的生成策略。JPA提供了4种标准用法。
(1)AUTO:根据不同的数据库选择不同的策略。
(2)TABLE:使用表保存id值。
(3)INDENITY:使用数据库自动生成主键(主要是自动增长类型,如MySql、SQL Server)。
(4)SEQUENCE:使用序列创建主键(如Oracle)。
配置持久化类的关联关系的方式:
1.实体类中注解的配置:
此案例中除 @GenericGenerator 的引用是org.hibernate.*外, 其他几个注解的引用皆为javax.persistence.*
001.Dept
1 package cn.happy.entity_annotations; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.annotation.Generated; 7 import javax.persistence.CascadeType; 8 import javax.persistence.Column; 9 import javax.persistence.Entity; 10 import javax.persistence.GeneratedValue; 11 import javax.persistence.GenerationType; 12 import javax.persistence.Id; 13 import javax.persistence.OneToMany; 14 import javax.persistence.SequenceGenerator; 15 import javax.persistence.Table; 16 17 import org.hibernate.annotations.GenericGenerator; 18 19 20 /** 21 * 注解1.1 22 */ 23 @Entity 24 @Table(name="DEPT") 25 public class Dept { 26 27 /*@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen") 28 @SequenceGenerator(name="seq_gen",sequenceName="HIBERNATE_SEQUENCE",allocationSize=1,initialValue=4)*/ 29 30 @Id 31 //主键生成策略 32 @GeneratedValue(generator="my_gen") 33 //自定义主键生成方式:uuid 34 @GenericGenerator(name="my_gen",strategy="uuid") 35 private Integer deptNo; 36 37 @Column(name="DNAME") 38 private String deptName; 39 40 @Column(name="LOC") 41 private String loc; 42 43 @OneToMany(mappedBy="dept",cascade={CascadeType.ALL}) 44 private Set<Emp> emps = new HashSet<Emp>(); 89 }
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen")
@SequenceGenerator(name="seq_gen",sequenceName="SEQ_Num",allocationSize=1,initialValue=4)
(1)使用@GeneratedValue设置主键生成策略。strategy=GenerationType.SEQUENCE描述了主键生成策略为Sequence,
generator="seq_emp"指定了生成器为 seq_emp。
(2)使用@SequenceGenerator设置了序列生成器,name="seq_name" 定义了序列生成器的名称为seq_emp;
seqenceName="seq_emp_id" 指定了序列Sequence的名称为seq_emp_id,数据库中需创建序列Sequence,名称为seq_emp_id;
initialValue=1 设置了主键初始值,默认为0; allocationSize=1 表示预分配多少个主键值,如设置为1,表示不预分配主键值,默认为50.
002.Emp
1 package cn.happy.entity_annotations; 2 3 import java.util.Date; 4 5 import javax.persistence.Column; 6 import javax.persistence.Entity; 7 import javax.persistence.FetchType; 8 import javax.persistence.GeneratedValue; 9 import javax.persistence.GenerationType; 10 import javax.persistence.Id; 11 import javax.persistence.JoinColumn; 12 import javax.persistence.ManyToOne; 13 import javax.persistence.NamedQuery; 14 import javax.persistence.SequenceGenerator; 15 import javax.persistence.Table; 16 17 /** 18 * 注解1.2 19 */ 20 @Entity 21 @Table (name="EMP") 22 @NamedQuery(name="selectEmp",query="from Emp e where e.empId>:eno") 23 public class Emp { 24 @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen") 25 @SequenceGenerator(name="seq_gen",sequenceName="SEQ_Num",allocationSize=1,initialValue=4) 26 @Column (name="EMPNO") 27 private Integer empId; 28 @Column (name="ENAME") 29 private String empName; 30 @Column 31 private String job; 32 @Column 33 private String mgr; 34 @Column 35 private Date hiredate; 36 @Column 37 private Integer sal; 38 @Column 39 private Integer comm; 40 @ManyToOne(fetch=FetchType.LAZY) 41 @JoinColumn(name="DEPTNO") 42 private Dept dept; 43 44 }