注解可以替換復雜的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 }