ID生成策略

注意:

a) 我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射

2        xml生成id

a)         generator

         <id name="id" >

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

</id>

b)         常用四个:native identity sequence uuid(要把id改成string类型)

3        注解方式:@GeneratedValue

a)       自定义ID

b)       AUTO(直接写 @GeneratedValue 相当如native)

                       i.      默认:对 MySQL,使用auto_increment

                    ii.      对 Oracle使用hibernate_sequence(名称固定)

@Id @GeneratedValue public int getId() { return id; }

 

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

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

    SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="生成器的名称"))

                       i.      @SequenceGenerator(自定义sequence生成器,可自定义在数据库生成指定的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//自定义table生成器

@TableGenerator(name="teacherID",         //生成器的名字

table="teacherID_DB",        //表的名字

pkColumnName="key_value",       //表的第一个字段名字

ValueColumnName="pk_value",        //表的第二个字段名字

              pkColumnValue="teacher",        //第一个字段的值

allocationSize=1)      //当读完一个value后,在其加上allocationSize的值,再放回value里

注:如果使用注解方式的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:@ld  @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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值