隨筆 - 0, 文章 - 75, 評論 - 0, 引用 - 0
          數據加載中……

          Annotation與XML配置ID生成策略

          最常用:native 由不同DB生成不同的策略


          其次:identity、sequence


          一些用:uuid


          ------------------------------------------


          XML配置:


          <id name="id">


          <generator class="策略"></generator>


          </id>



          Annotation:


          @Id
          @GeneratedValue //默認auto相當于native
          public int getId()
          {
          return id;
          }


          ------------------------------------------


          指定使用的是哪個序列


          Annotation:


          @SequenceGenerator(name="teacherSEQ",sequenceName="DB中的序列名")


          name屬性是給自己起個名字,標志自己


          sequenceName才是DB中的序列名



          注意:在class前面使用!


          @SequenceGenerator(name="teacherSEQ",sequenceName="teacher_seq")
          public
          class Teacher {...}



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


          strategy指生成策略


          generator指定前面定義的SequenceGenerator的名字



          原理:當Hibernate生成表時,發現策略是sequence,然后發現generator用的是“teacherSEQ”


          去找名叫“teacherSEQ”的SequenceGenerator,之后發現用的序列的名字叫sequenceName


          生成該sequenceName序列,Teacher表永遠用的是該序列



          示例:


          @Entity
          @SequenceGenerator(name="teacherSEQ",sequenceName="teacher_seq")
          public
          class Teacher {


          private int id;


          @Id
          @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
          //主鍵生成策略,默認auto相當于native
          public int getId() {
          return
          id;
          }


          //省略其他........


          }



          ------------------------------------------


          不常用


          @TableGenerator(


          name="Teacher_GEN", //給自己起個名字


          table="GENRTATOR_TABLE",
          //新建一張表用來保存主鍵生成策略,表名叫:GENRTATOR_TABLE


          pkColumnName="key", //主鍵列叫key


          valueColumnName="value", //值列叫value


          pkColumnValue="Teacher", //主鍵列的一個數據,叫Teacher


          allocationSize=1 //遞增量


          )


          它寫在class前


          使用它生成主鍵策略時,還需設置@GeneratedValue(strategy=GenerationType.TABLE)


          使用它可以跨DB平臺、針對不同DB生成不同主鍵標識


          ------------------------------------------


          聯合主鍵



          首先修改javaBean,創建一個主鍵類,里面包含主鍵字段屬性


          還需實現java.io.Serialize接口和重寫equals和hashCode方法


          @Override


          public boolean equals(Object o){


          if(o instanceof TeacherPK){


          TeacherPK pk = (TeacherPK)o;


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


          return true;


          }


          }


          return false;


          }



          @Override


          public int hashCode(){


          return this.name.hashCode();


          }


          在該javaBean中使用主鍵類做屬性


          private TeacherPK pk;


          public TeacherPK getTeacherPK(){


          return pk;


          }


          修改XML映射文件配置:


          將<id>標簽換成<composite-id>標簽


          <composite-id name="你的javaBean中PK類的引用" class="PK類路徑">


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


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


          </composite-id>


          配置了聯合主鍵為:id、name



          解釋:為什么javaBean要實現java.io.Serializable接口?


          比如Teacher類對應數據表有多條記錄,在內存中有很多Teacher對象


          如果做集群,則需要發送數據、序列化


          如果內存滿了,使用虛擬內存,需在硬盤上序列化



          為什么重寫equals?


          內存中有很多Teacher時,DB以PK區分它們


          內存也應有一種邏輯做區分,否則與DB不同步,所以重寫equals



          為什么重寫hashCode?


          把一系列Teacher對象放到哈希表中,需計算Teacher哈希碼


          DB用PK區分,所以用主鍵計算哈希碼


          如果想從哈希表中找Teacher對象,先計算出該hashCode的值,然后在與鏈表中的對象比較equals




          Annotation定義組合主鍵的3種語法:


          1.將組件類(PK)注解為@Embeddable、并將組件的屬性(javaBean中的PK的引用)注解為@Id


          2.組件的屬性注解為@EmbeddedId


          @EmbeddedId


          public TeacherPK getPk(){


          return pk;


          }


          3.將javaBean類注解@IdClass并將該實體中所有屬于主鍵的屬性注解為@Id


          @IdClass


          public class Teacher{


          private int id;


          private String name;


          @Id


          public int getId(){}


          @Id


          public String getName(){}


          }



          ------------------------------------------

          posted on 2012-04-22 16:01 hantai 閱讀(224) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 莒南县| 闽清县| 来凤县| 鹰潭市| 崇文区| 寿光市| 思茅市| 仪征市| 石渠县| 四子王旗| 温泉县| 普洱| 长子县| 鹤壁市| 息烽县| 临湘市| 奉节县| 资兴市| 南康市| 淳安县| 扎鲁特旗| 丽水市| 乡宁县| 嘉黎县| 武鸣县| 郯城县| 濉溪县| 玛曲县| 无棣县| 乌兰浩特市| 梅河口市| 琼结县| 长治市| 上犹县| 凤冈县| 南郑县| 赤城县| 苏尼特右旗| 峨眉山市| 墨玉县| 安国市|