您的位置:首页 > 其它

id生成策略-(联合主键xml annotation)-5

2017-05-28 23:07 405 查看

xml中:

新建主键类

// 注意实现序列化,原因a:如果集群中某机器down掉,可能要求把对象写到其他服务器磁盘上;原因b:机器可能使用虚拟内存,将对象写磁盘上
// 注意重写equals  hashCode  原因:对象有可能存内存的hash表里,不要hashCode确定位置,需要equals比较对象的一致
public class StudentPK implements Serializable{
private  int id;
private  String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object o){
if(o instanceof StudentPK){
StudentPK s = (StudentPK)o;
if(this.id == s.getId() && this.name == s.getName()){
return true;
}
}
return  false;
}

@Override
public int hashCode(){
return this.name.hashCode();
}
}


实体中用主键类作为pk

xml中配置映射

<class name="Student">
<!--联合主键-->
<composite-id name="pk" class="model.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id>
<property name="age"/>
</class>


annotation中(3种方式):

1.将组件类注解为@Embeddable,并将组件的属性注解为@Id(不常用)

@Embeddable
public class TeacherPK implements Serializable{...}


public class Teacher {
...
@Id
public TeacherPK getPk() {
return pk;}
...
}


2.将组件的属性注解为@EmbeddedId(第二第三选一种)

public class Teacher {
...
@EmbeddedId
public TeacherPK getPk() {
return pk;}
...
}


3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id(第二第三选一种)

@IdClass(TeacherPK.class)
public class Teacher {
...
@Id
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}
@Id
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
...}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate