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

          導航

          常用鏈接

          留言簿

          隨筆分類(5)

          隨筆檔案(19)

          文章分類(1)

          文章檔案(1)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

              

              首先來看一下如何使用JPA標準定義一個Hibernate的POJO對象
           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 
              可以看到上邊的例子中多了幾個注解(annotation),其實annotation也是像java類一樣的東西,當你寫了一個注解的時候,java編譯器就會調用注解的方法來幫你做一下事情。如Entity就表示這個類是一個實體,table表示在持久化的時候的表的屬性相關聯的東西。接下來就是我們的id生成器了。
              在你需要該列是ID的位置寫上@Id 那么該列在持久化的時候就會生成為主鍵。當然這里的主鍵建議時候包裝類型的如Integer Long
              當然我在這里只復習了annotation的持久化,XML的可以參考曹小剛翻譯的hibernate文檔。
              1        注意:

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

              2    xml生成id

          a)         generator

                   <id name="id" >

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

                   </id>

          b)         常用四個:native identity sequence uuid

              3        注解方式:@GeneratedValue

          a)       自定義ID

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

                                 i.      默認:對 MySQL,使用auto_increment

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

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

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

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

                  @Id

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

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

          //"teacherSEQ"@SequenceGenerator的標識名

          //"teacherSEQ_DB"為指定到數據庫生成的Sequence

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

          public int getId() {

                              return id;

          }

          e)       TABLE (可以忘記)

                                   i.        @TableGenerator

          @TableGenerator(

          name="teacherID",                     //被調用的TABLE名字

                    table="teacherID_DB",                //數據庫建立的表名

                    pkColumnName="key_value",

                    pkColumnValue="pk_value",

                    valueColumnName="teacher",             //pkColumnValue對應類名

                    allocationSize=1                          //pkColumnValue對應類名

          )

           

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

           

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

                        @Id

          @GeneratedValue(generator="teacherUUID")

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

              4        FAQ;

          a) Junit測試時Hibernate Session Factory初始化異常不提示.疑似一個bug

          b) main來做測試

          5        聯合主鍵

          a) Xml方式: composite-id

                                i.        將聯合主鍵的屬性提取出來,重新編寫一個pojo類(原pojo類中的id,name要刪除 并新加入屬性“StudentPK”)

               public class StudentPK implements Serializable {

                             private String id;

                             private String name;

                             … …

                            ii.        新建pojo類必須實現 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.        聯合主鍵生成策略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類 都要實現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 安多 閱讀(397) 評論(0)  編輯  收藏 所屬分類: S2SH Learning
           
          Copyright © 安多 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 连州市| 邹平县| 潞西市| 江华| 昭觉县| 西乌珠穆沁旗| 雅江县| 家居| 岑溪市| 乐都县| 冷水江市| 秦皇岛市| 万年县| 崇义县| 禹城市| 保康县| 綦江县| 渝北区| 高清| 宜良县| 循化| 新昌县| 平谷区| 广西| 襄城县| 长兴县| 临西县| 雷州市| 东乌珠穆沁旗| 保德县| 垫江县| 湘西| 闽侯县| 富蕴县| 铜山县| 湟源县| 长春市| 永泰县| 达孜县| 太仆寺旗| 瓦房店市|