andy-j2ee  
          JAVA
          公告
          • 在夜深人靜的時(shí)候,偶彈起心愛的土琵琶,唱起那動(dòng)人的歌謠(柯受良-《大哥》):偶寫了代碼好多年,偶不愛冰冷的床沿,不要逼偶想念,不要逼偶流淚,偶會(huì)翻。
          日歷
          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345
          統(tǒng)計(jì)
          • 隨筆 - 19
          • 文章 - 1
          • 評(píng)論 - 1
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿

          隨筆分類(5)

          隨筆檔案(19)

          文章分類(1)

          文章檔案(1)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

              

              首先來看一下如何使用JPA標(biāo)準(zhǔn)定義一個(gè)Hibernate的POJO對(duì)象
           1 package com.anduo.hibernate.model;
           2 
           3 import java.util.Date;
           4 
           5 import javax.persistence.Column;
           6 import javax.persistence.Entity;
           7 import javax.persistence.GeneratedValue;
           8 import javax.persistence.Id;
           9 import javax.persistence.Table;
          10 import javax.persistence.Temporal;
          11 import javax.persistence.TemporalType;
          12 
          13 @Entity
          14 @Table(name="tb_student")
          15 public class Student {
          16     private Long id;
          17     private String name;
          18     private int age;
          19     private Date birthday;
          20 
          21     @Id
          22     @GeneratedValue
          23     @Column(name="s_id")
          24     public Long getId() {
          25         return id;
          26     }
          27 
          28     public void setId(Long id) {
          29         this.id = id;
          30     }
          31     @Column(name="s_name")
          32     public String getName() {
          33         return name;
          34     }
          35 
          36     public void setName(String name) {
          37         this.name = name;
          38     }
          39     
          40     @Column(name="s_age")
          41     public int getAge() {
          42         return age;
          43     }
          44 
          45     public void setAge(int age) {
          46         this.age = age;
          47     }
          48     
          49     @Column(name="s_birthday")
          50     @Temporal(TemporalType.DATE)
          51     public Date getBirthday() {
          52         return birthday;
          53     }
          54 
          55     public void setBirthday(Date birthday) {
          56         this.birthday = birthday;
          57     }
          58 
          59 }
          60 
              可以看到上邊的例子中多了幾個(gè)注解(annotation),其實(shí)annotation也是像java類一樣的東西,當(dāng)你寫了一個(gè)注解的時(shí)候,java編譯器就會(huì)調(diào)用注解的方法來幫你做一下事情。如Entity就表示這個(gè)類是一個(gè)實(shí)體,table表示在持久化的時(shí)候的表的屬性相關(guān)聯(lián)的東西。接下來就是我們的id生成器了。
              在你需要該列是ID的位置寫上@Id 那么該列在持久化的時(shí)候就會(huì)生成為主鍵。當(dāng)然這里的主鍵建議時(shí)候包裝類型的如Integer Long
              當(dāng)然我在這里只復(fù)習(xí)了annotation的持久化,XML的可以參考曹小剛翻譯的hibernate文檔。
              1        注意:

          a)  我們觀察hibernate生成表的結(jié)構(gòu)并不是為了將來就用它生成,(可能還有自己的擴(kuò)展,比如index等)而是為了明白我們應(yīng)該建立什么樣的表和實(shí)體類映射

              2    xml生成id

          a)         generator

                   <id name="id" >

                       <generator class="native"></generator>

                   </id>

          b)         常用四個(gè):native identity sequence uuid

              3        注解方式:@GeneratedValue

          a)       自定義ID

          b)       AUTO(直接寫 @GeneratedValue 相當(dāng)如native) (@GeneratedValue(strategy=GenerationType.AUTO))

                                 i.      默認(rèn):對(duì) MySQL,使用auto_increment

                              ii.      對(duì) Oracle使用hibernate_sequence(名稱固定)

          c)       IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY))

          d)       SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))

                                 i.      @SequenceGenerator(可自定義在數(shù)據(jù)庫(kù)生成指定的sequence名)

                  @Id

          //@GeneratedValue中增加 generator="teacherSEQ"

          @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")

          //"teacherSEQ"@SequenceGenerator的標(biāo)識(shí)名

          //"teacherSEQ_DB"為指定到數(shù)據(jù)庫(kù)生成的Sequence

          @SequenceGenerator(name="teacherSEQ", sequenceName="teacherSEQ_DB")

          public int getId() {

                              return id;

          }

          e)       TABLE (可以忘記)

                                   i.        @TableGenerator

          @TableGenerator(

          name="teacherID",                     //被調(diào)用的TABLE名字

                    table="teacherID_DB",                //數(shù)據(jù)庫(kù)建立的表名

                    pkColumnName="key_value",

                    pkColumnValue="pk_value",

                    valueColumnName="teacher",             //pkColumnValue對(duì)應(yīng)類名

                    allocationSize=1                          //pkColumnValue對(duì)應(yīng)類名

          )

           

          @GeneratedValue(strategy=GenerationType.TABLE,generator=" teacherID ")

           

                 注:如果使用注解方式的uuid 如下:

                        @Id

          @GeneratedValue(generator="teacherUUID")

          @GenericGenerator(name="teacherUUID", strategy="uuid")

              4        FAQ;

          a) Junit測(cè)試時(shí)Hibernate Session Factory初始化異常不提示.疑似一個(gè)bug

          b) main來做測(cè)試

          5        聯(lián)合主鍵

          a) Xml方式: composite-id

                                i.        將聯(lián)合主鍵的屬性提取出來,重新編寫一個(gè)pojo類(原pojo類中的id,name要?jiǎng)h除 并新加入屬性“StudentPK”)

               public class StudentPK implements Serializable {

                             private String id;

                             private String name;

                             … …

                            ii.        新建pojo類必須實(shí)現(xiàn) java.io.Serializable 序列化接

                         iii.        新pojo類要重寫equals和hashCode方法

          @Override

          public boolean equals(Object o) {

                 if(o instanceof StudentPk) {

                        StudentPk pk = (StudentPk)o;

                        if(this.id == pk.getId() && this.name.equals(pk.getName())) {

                         return true;

                        }

                 }

                 return false;

          }

           

          @Override

          public int hashCode() {

                 return this.name.hashCode();

          }

                            iv.        聯(lián)合主鍵生成策略XML配置方法

                 <hibernate-mapping>

                             <class name="com.bjsxt.pojo.Student" >

                                      <composite-id name="studentPK" class="com.bjsxt.pojo.StudentPK">

                                               <key-property name="id"></key-property>

                                               <key-property name="name"></key-property>

                                      </composite-id>

                                      <property name="age" />

                                      <property name="sex" />

                                      <property name="good" type="yes_no"></property>

                             </class>

          </hibernate-mapping>

           

          b) Annotation

                                i.        前三步與Xml方式前三步一樣 都要建立新pojo類 都要實(shí)現(xiàn)Serializable接口 重寫equals和hashCode方法.

                            ii.        方法1在新類前寫@Embeddable,在原pojo類的新屬性“TercherPK”的get方法前寫@ld,如下

              @ Embeddable

          public class TeacherPK implements Serializable {

                             private String id;

                             private String name;

                             … …

           

                       @Entity

          public class Teacher {

          private TeacherPK teacherPK ;

          @Id

          public TeacherPK getTeacherPK() {

                                      return teacherPK;

          }

          … …

                         iii.        方法2:@EmbeddedlD(*) pojo類無需加注解,只需在原pojo新屬性“TercherPK”的get方法前寫@EmbeddedlD即可

                               iv.        方法3@Id  @IdClass(*)  pojo類無需加注解,原pojo類的idname屬性保留不變,也無需新增“TercherPK”屬性。 只在idnameget方法前都加@Id,并在原pojo類前加@IdClass(TeacherPK).class),如下

          @Entity

          @IdClass(TeacherPK.class)

          public class Teacher {

          private String id;

          private String name;

          @Id

          public String getId() {

                        return id;

          }

          @Id

          public String getName() {

                        return name;

          }

          ... ...



          posted on 2011-10-07 09:27 安多 閱讀(402) 評(píng)論(0)  編輯  收藏 所屬分類: S2SH Learning
           
          Copyright © 安多 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 股票| 玉树县| 洛南县| 海门市| 大姚县| 宾阳县| 徐汇区| 耒阳市| 峨眉山市| 界首市| 德州市| 大冶市| 康马县| 易门县| 鄯善县| 墨玉县| 收藏| 成安县| 那曲县| 襄樊市| 辽阳市| 肥乡县| 宜州市| 友谊县| 会泽县| 博爱县| 米泉市| 石棉县| 洪泽县| 安宁市| 牡丹江市| 韩城市| 孙吴县| 瑞丽市| 额尔古纳市| 廉江市| 西城区| 襄垣县| 凤城市| 祁门县| 星子县|