您的位置:首页 > 其它

Hibernate学习笔记(三)----ID生成策略、联合主键

2017-03-27 17:39 519 查看
一、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配置方法
       <hibernate-mapping>

                   <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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: