隨筆 - 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 閱讀(226) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 黄冈市| 武宣县| 尉氏县| 定结县| 郓城县| 黎城县| 微山县| 共和县| 河东区| 舟山市| 通州市| 南通市| 抚松县| 通榆县| 遵化市| 萨迦县| 吴忠市| 湖南省| 滦平县| 八宿县| 奇台县| 华宁县| 湘阴县| 临汾市| 日土县| 响水县| 渭南市| 霍邱县| 广安市| 珲春市| 文山县| 南涧| 抚州市| 泸州市| 赫章县| 彭水| 贵南县| 平谷区| 集贤县| 绥化市| 辉南县|