Hibernate框架註解

1.使用Hibernate註解的步驟
                1.添加jar包
                            Hibernate-annotations.jar
                            Hibernate-commons-annotations.jar
                            ejb3-persistence.jar
                2.使用註解配置持久化類及對象關聯關係
                3.使用AnnotationConfiguration創建會話工廠
                            sessionFactory = new  AnnotationConfiguration().configure().buildSessionFactory();
                4.在Hibernate配置文件(hibernate.cfg.xml)中聲明持久化類
                            <mapping class="持久化類完整限定名" />
        2.配置持久化類的經常使用註解
                @Entity     將一個類聲明爲一個持久化類
                @Id            聲明瞭持久化類的標識屬性(至關於數據表的主鍵)
                @GeneratedValue    定義標識屬性值的生成策略
                @Table        爲持久化類映射指定表(table)。目錄(catalog)和schema的名稱。默認值:持久化類名,不帶包名
                @UniqueConstraint  定義表的惟一約束
                @Lob        表示屬性將被持久化爲Blob或者Clob類型
                @Column        將屬性映射到列
                @Transient    忽略這些字段和屬性,不用持久化到數據庫
                
                
                @GeneratedValue    定義標識屬性值的生成策略,JPA提供了4種標準用法
                        (1) AUTO:根據不一樣的數據庫選擇不一樣的策略
                        (2) TABLE:使用表保存id值
                        (3) INDENTITY:使用數據庫自動生成主鍵
                        (4) SEQUENCE:使用序列建立主鍵
          java

      

3.十三種策略(strategy屬性的值)以下:mysql

● native算法

對於orcale採用Sequence方式,對於MySQL和SQL Server採用identity(處境主鍵生成機制),native就是將主鍵的生成工做將由數據庫完成,hibernate無論(很經常使用)sql

例:@GeneratedValue(generator = "paymentableGenerator")數據庫

       @GenericGenerator(name = "paymentableGenerator", strategy = "native")session

● uuid數據結構

採用128位的uuid算法生成主鍵,uuid被編碼爲一個32位16進制數字的字符串。佔用空間大(字符串類型)。oracle

例:@GeneratedValue(generator = "paymentableGenerator")app

       @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")ide

● hilo

要在數據庫中創建一張額外的表,默認表名爲hibernate_unque_key,默認字段爲integer類型,名稱是next_hi(比較少用)。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "hilo")

● assigned

在插入數據的時候主鍵由程序處理(很經常使用),這是<generator>元素沒有指定時的默認生成策略。等同於JPA中的AUTO。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")

● identity

使用SQL Server和MySQL的自增字段,這個方法不能放到Oracle中,Oracle不支持自增字段,要設定sequence(MySQL和SQL Server中很經常使用)。等同於JPA中的IDENTITY

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "identity")

● select

使用觸發器生成主鍵(主要用於早期的數據庫主鍵生成機制,少用)

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "select")

● sequence

調用謹慎數據庫的序列來生成主鍵,要設定序列名,否則hibernate沒法找到。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "sequence", parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") }) 

● seqhilo

經過hilo算法實現,可是主鍵歷史保存在Sequence中,適用於支持Sequence的數據庫,如Orcale(比較少用)。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo", parameters = { @Parameter(name = "max_lo", value = "5") }) 

● increnment

插入數據的時候hibernate會給主鍵添加一個自增的主鍵,可是一個hibernate實例就維護一個計數器,因此在多個實例運行的時候不能使用這個方法。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "increnment")

● foreign

使用另外一個相關的對象的主鍵。一般和@OneToOne聯合起來使用。

例:@Id

       @GeneratedValue(generator = "idGenerator")

       @GenericGenerator(name = "idGenerator", strategy = "foreign", parameters = { @Parameter(name = "property", value = "info") })

       Integer id;

 

       @OneToOne

       EmployeeInfo info;

● guid

採用數據庫底層的guid算法機制,對應MySQL的uuid()函數,SQL Server的newid()函數,ORCALE的rawtohex(sys_guid())函數等。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "guid")

● uuid.hex

參見uuid,建議用uuid替換。

● sequence-identity

sequence策略的擴展,採用當即檢索策略來獲取sequence值,須要JDBC3.0和JDK4以上(含1.4)版本。

例:@GeneratedValue(generator = "paymentableGenerator")

       @GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity", parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

 8. @Transient

聲明瞭非持久化屬性,即數據庫中沒有相應的映射字段,是一個普通屬性。

9. @Temporal

聲明瞭日期類型。

TemporalType.DATE 日期,例:2011-04-12

TemporalType.TIME 時間,例:22:50:30

TemporalType.TIMESTAMP 日期和時間,例:2011-04-12 22:51:30

10. @Version

聲明瞭對樂觀鎖定的支持

例:@Version

       @Column(name="OPTLOCK")

       public Integer getVersion() { ... }

上面這個例子中,version屬性將映射到 OPTLOCK列,entity manager使用該字段來檢測更新衝突(防止更新丟失,請參考last-commit-wins策略)。

根據EJB3規範,version列能夠是numeric類型(推薦方式)也能夠是timestamp類型。Hibernate支持任何自定義類型,只要該類型實現了UserVersionType。

                                                                         eg:                Emp.java                    import javax.persistence.*                                                @Entity                        @Talble(name="Emp")                        public class Emp implements jaca.io.Serializable{                            @Id                            @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_emp")                            @SequenceGenerator(name = "seq_emp",sequenceName = "seq_emp_id",                                allocationSize = 10,initialValue = 1)                            private Short empNo;                            @Column(name = "ename")                            private String eName;                            @Column(name = "hiredate")                            private Date hiredate;                            @Transient                            private Dept dept;                            @Transient                            private String job;                            @Transient                            private Short mgr;                            @Transient                            private Double salary;                            @Transient                            private Double comm;                            public  Emp(){}                            //省略getter()和setter方法                        }                                Hibernate.cfg.xml                                    <hibernate-configuration>                        <session-factory>                            <mapping class="cn.jbit.hibernatedemo.entity.Emp"/>                        </session-factory>                    </hibernate-configuration>                                    測試類代碼:                    SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();                    Session session = sf.openSession();                    Transantion tx = session.beginTranaction();                    Emp emp = new Emp();                    emp.setEmpName("test1");                    emp.setHiredate(new Date());                    session.save();                    tx.commit();                                    //注:                    1.Emp類映射到Emp表,empNo爲主鍵,主鍵採用序列生成,需在數據庫中建立序列Sequence,                            名爲seq_emp_id 註解都放置在屬性定義的上方                    2.使用@GeneratedValue設置主鍵生成策略,strantegy = Generatipe.Sequence描述了主鍵生成策略爲Sequence                            generator = "seq_emp"指定了生成器爲seq_emp;                    3.使用@SequenceGenerator設置了序列生成器,name="seq_emp"定義了序列生成器的名稱爲seq_emp;sequenceName                            ="seq_emp_id"指定了序列Sequence的名稱爲seq_emp_id,數據庫中需建立序列Sequence,名稱爲seq_emp_id                            ;initialValue = 1 設置了主鍵初始值,默認爲0;allocationSize=1表示預分配多少個主鍵值,如設置爲1                            表示不預分配主鍵值,默認爲50                    4.使用@Column把empName屬性映射到EMP表中的Ename列                      使用@Column把hiredate屬性映射到EMP表中的Hiredate列                      使用@Transient把其餘屬性忽略,不持久化到數據庫中                      在Hibernate.cfg.xml中,使用mapping元素聲明持久化類                3.註解配置對象關聯關係                @OneToOne            創建持久化類之間的一對一關聯關係                @OneToMany            創建持久化類之間的一對多關聯關係                @ManyToOne            創建持久化類之間的多對一關聯關係                @ManyToMany            創建持久化類之間的多對多關聯關係                                        3.1 按主鍵查詢員工,並使用@ManyToMany加載部門                            eg:                    Emp.java                                        import javax.persistence.*                                                @Entity                        @Talble(name="Emp")                        public class Emp implements jaca.io.Serializable{                            @Id                            @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_emp")                            @SequenceGenerator(name = "seq_emp",sequenceName = "seq_emp_id",                                allocationSize = 10,initialValue = 1)                            private Short empNo;                            @Column(name = "ename")                            private String eName;                            @Column(name = "hiredate")                            private Date hiredate;                            @ManyToOne                   使用@ManyToOne配置了Emp和Dept類之間的多對一關聯;使用JoinColumn                                                            (name="deptNo")指定了維繫關係的外鍵字段是EMP表中的DeptNo。Hibernate                                                                Hibernate生成的SQL語句使用了左外鏈接關鍵字                            @JoinColumn(name = "deptno")                            private Dept dept;                            public  Emp(){}                            //省略getter()和setter方法                        }                                                    Dept.java                                            @Entity                        @Talble(name="Dept")                        public class Dept implements java.io.Serializable{                            @Id                            private Integer deptNo;                            @Column(name="dname")                            private String deptName;                            //省略getter和setter方法                            public Dept(){}                        }                                                                Hibernate.cfg.xml                                    <hibernate-configuration>                        <session-factory>                            <mapping class="cn.jbit.hibernatedemo.entity.Emp"/>                            <mapping class="cn.jbit.hibernatedemo.entity.Dept"/>                        </session-factory>                    </hibernate-configuration>                                    測試類代碼:                                    SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();                    Session session = sf.openSession();                    Transantion tx = session.beginTranaction();                    Emp emp = (Emp)session.load(Emp.class,new Short("3"));                    System.out.print(emp.getEmpName()+","+emp.getDept().getDeptName());                                                3.2 級聯的配置,添加部門的同時添加員工                            cascade屬性指定級聯操做                    1.CascadeType.remove:鏈接刪除                    2.CascadeType.persist:persist()方法級聯                    3.CascadeType.merge:級聯更新                    4.CascadeType.refresh:級聯刷新                    5.CascadeType.all:包含所欲有級聯操做                eg:                    Emp.java                                        import javax.persistence.*                                                @Entity                        @Talble(name="Emp")                        public class Emp implements jaca.io.Serializable{                            @Id                            @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_emp")                            @SequenceGenerator(name = "seq_emp",sequenceName = "seq_emp_id",                                allocationSize = 10,initialValue = 1)                            private Short empNo;                            @Column(name = "ename")                            private String eName;                            @Column(name = "hiredate")                            private Date hiredate;                            @ManyToOne                   使用@ManyToOne配置了Emp和Dept類之間的多對一關聯;使用JoinColumn                                                            (name="deptNo")指定了維繫關係的外鍵字段是EMP表中的DeptNo。Hibernate                                                                Hibernate生成的SQL語句使用了左外鏈接關鍵字                            @JoinColumn(name = "deptno")                            private Dept dept;                            public  Emp(){}                            //省略getter()和setter方法                        }                                                    Dept.java                                            @Entity                        @Talble(name="Dept")                        public class Dept implements java.io.Serializable{                            @Id                            private Integer deptNo;                            @Column(name="dname")                            private String deptName;                            @Transient                            private String location;                            @OneToMany(mappedBy="dept",cascade = {CascadeType.ALL})                            private Set<Emp> emps = new  HashSet<Emp>();                            //省略getter和setter方法                            public Dept(){}                        }                                                                Hibernate.cfg.xml                                    <hibernate-configuration>                        <session-factory>                            <mapping class="cn.jbit.hibernatedemo.entity.Emp"/>                            <mapping class="cn.jbit.hibernatedemo.entity.Dept"/>                        </session-factory>                    </hibernate-configuration>                                    測試類代碼:                                    SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();                    Session session = sf.openSession();                    Transantion tx = session.beginTranaction();                    Dept dept = new Dept(6,"產品部");                    Emp emp = new  Emp();                    emp.setEmpName("villy");                    emp.setHiredate(new Date());                    dept.getEmps().add(emp);                    emp.setDept(dept);                    session.save(dept)'                    tx.commit();                                                4.註解配置命名查詢                Emp.java                        @Entity                        @Talble(name="Emp")                        @NamedQuery(name="selectEmp",query="from Emp where empName like :ename")                        public class Emp implements jaca.io.Serializable{                            @Id                            @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_emp")                            @SequenceGenerator(name = "seq_emp",sequenceName = "seq_emp_id",                                allocationSize = 10,initialValue = 1)                            private Short empNo;                            @Column(name = "ename")                            private String eName;                            @Column(name = "hiredate")                            private Date hiredate;                            @ManyToOne                   使用@ManyToOne配置了Emp和Dept類之間的多對一關聯;使用JoinColumn                                                            (name="deptNo")指定了維繫關係的外鍵字段是EMP表中的DeptNo。Hibernate                                                                Hibernate生成的SQL語句使用了左外鏈接關鍵字                            @JoinColumn(name = "deptno")                            private Dept dept;                            public  Emp(){}                            //省略getter()和setter方法                        }                                        測試類代碼:                                    List<Emp> list = session.getNameQuery("selectEmp").setString("ename","%r%").list();                    for(Emp emp : list){                        System.out.print(emp.getEmpName);                    }

相關文章
相關標籤/搜索