java xml annotation_Annotation与XML配置ID生成策略

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

其次:identity、sequence

一些用:uuid

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

XML配置:

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、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(){}

}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值