1. 程式人生 > >Hibernate學習筆記(三)----ID生成策略、聯合主鍵

Hibernate學習筆記(三)----ID生成策略、聯合主鍵

一、ID生成策略(參考hibernate_0400_ID)

1)xml生成id使用generator屬性

         <idname="id" >

         <generatorclass="native"></generator>

</id>

常用四個:native identitysequence uuid

2)註解方式:@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")

public int getId() {

returnid;

}

//"teacherSEQ"@SequenceGenerator的標識名

//"teacherSEQ_DB"為指定到資料庫生成的Sequence

@Entity

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

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")

二、聯合主鍵

a)  Xml方式: composite-id

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

      public class StudentPK implements Serializable {

         privateString id;

         privateString name;

… …

                 ii.       新建pojo類必須實現 Java.io.Serializable序列化接

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

@Override

public boolean equals(Object o) {

if(oinstanceof StudentPk) {

StudentPkpk = (StudentPk)o;

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

  return true;

}

}

returnfalse;

}

@Override

public int hashCode() {

returnthis.name.hashCode();

}

                 iv.       聯合主鍵生成策略XML配置方法

<classname="com.bjsxt.pojo.Student" >

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

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

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

</composite-id>

<propertyname="age" />

<propertyname="sex" />

<propertyname="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 {

         privateString id;

         privateString name;

… …

  @Entity

public classTeacher {

privateTeacherPK teacherPK ;

@Id

publicTeacherPK getTeacherPK() {

                  returnteacherPK;

}

… …

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

                    iv.       方法3:@Id @IdClass(*)  新pojo類無需加註解,原pojo類的id,name屬性保留不變,也無需新增“TercherPK”屬性。 只在id,name的get方法前都加@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;

}