Hibernate之ID生成策略—联合主键

来源:互联网 发布:数字摇号软件 编辑:程序博客网 时间:2024/06/04 23:21

(一)使用XML配置文件的方式

将联合主键单独写到一个类中

该类必须实现java.io.Serializable接口,重写equals()方法和hashCode()方法

package com.sdga.hibernate;

public class StudentPK implements java.io.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 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();
}

}

(1)序列化:实现序列化就是:implements Serializable接口
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
其实就是将程序中的数据(对象)通过某种方式,保存到本地中。然后把Java对象转换为字节序列的过程称为对象的序列化。

(2)重写equals()方法就是保证数据的唯一性
(3)重写hashCode()方法就是将数据保存到哈希表中时,首先计算对象的哈希码,找到该对象。

在student.hbm.xml中进行配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.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" />
<property name="sex" />
<property name="good" type="yes_no"></property>
    </class>
</hibernate-mapping>

(二)基于注解的方式(3种方法)(embeddable:可嵌入的)

1、将组件类注解为@Embeddable,并将组件的属性注解为@Id

2、将组件的属性注解为@EmbeddedId

3、将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

其中:第二种和第三种最常用

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

@Embeddable

public class TeacherPK implements java.io.Serializable{
private int id;
private String name;


@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();
}
}

——————————————————————————————————————————————————


public class Teacher {
private TeacherPK pk;
@Id

public TeacherPK  getPk(){

return pk;     

          }

public void setPk(TeacherPK pk){

  this.pk=pk;

        }
}


(2)将组件的属性注解为@EmbeddedId


public class Teacher {
private TeacherPK pk;
@EmbeddedId

public TeacherPK  getPk(){

return pk;     

          }

public void setPk(TeacherPK pk){

  this.pk=pk;

        }
}


(3)将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

@IdClass(TeacherPK.class)
public class Teacher {
//private TeacherPK pk;
private int id;
private String name;

@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="Teacher_GEN")
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;
}
}

联合主键类不做操作

public class TeacherPK implements java.io.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 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();
}
}