Hibernate中聯合主鍵建置原則,hibernate主鍵
一、xml配置聯合主鍵
單獨設計一個類,作為主鍵類,如StudentPK
A、實現序列化(Serializable介面)
B、重寫equals()和hashCode()
為什麼要從寫equals()和hashCode()方法?
hashCode相同的會被儲存在hash表的同一位置,當找到特定的hashcode之後,會根據equals()方法判斷是否是相同的對象,來尋找到對應的資料。
小實驗1:
(1)建立聯合主鍵類StudentPK
package com.zgy.hibernate.model;
import java.io.Serializable;
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;
}
public boolean equals(Object o){
if(o instanceof StudentPK){
StudentPK pk = (StudentPK)o;
if(this.id == pk.getId() && this.name == pk.getName()){
return true;
}
}
return false;
}
public int hashCode(){
return this.name.hashCode();
}
}
(2) 使用xml配置聯合主鍵
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zgy.hibernate.model">
<class name="Student" table="student">
<!-- <id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
-->
<!-- 聯合主鍵的配置方式 -->
<composite-id name="pk" class="com.zgy.hibernate.model.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id>
<property name="age" column="age"></property>
<property name="score" column="score"></property>
</class>
</hibernate-mapping>
(3)編寫測試程式
package com.zgy.hibernate.model;
import static org.junit.Assert.*;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class HibernateIDTest {
public static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testStudent() {
StudentPK pk = new StudentPK();
pk.setId(1);
pk.setName("zhangsan");
Student s = new Student();
s.setPk(pk);
// s.setName("張三");
s.setAge(20);
s.setScore(90);
Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
二、Annotation配置聯合主鍵方法一:使用@Embeddable
在聯合主鍵類上,配置@Embeddable
在Teacher.java中,getPk()上寫@Id
小實驗2:
(1)建立TeacherPK.java
package com.zgy.hibernate.model;
import java.io.Serializable;
import javax.persistence.Embeddable;
@Embeddable
public class TeacherPK 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;
}
public boolean equals(Object o){
if(o instanceof TeacherPK){
TeacherPK pk = (TeacherPK)o;
if(this.id == pk.getId() && this.name == pk.getName()){
return true;
}
}
return false;
}
public int hashCode(){
return this.name.hashCode();
}
}
(2)測試
package com.zgy.hibernate.model;
import static org.junit.Assert.*;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TeacherTesting {
public static SessionFactory sf = null;
@BeforeClass
public static void beforeClass(){
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void test() {
TeacherPK pk = new TeacherPK();
pk.setId(1);
pk.setName("t1");
Teacher t = new Teacher();
t.setPk(pk);
// t.setName("t1");
t.setTitle("進階");
t.setAddress("北京");
t.setBirth(new Date());
t.setZhiCheng(ZhiCheng.A);
Session session = sf.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
(3)查看結果
select * from teacher;
desc teacher;
方法二:在方法上添加@EmbeddedId
直接在Teacher.java中的getPK()方法上添加@EmbeddedId
小實驗3:
(1)修改Teacher.java
package com.zgy.hibernate.model;
import java.util.Date;
import javax.annotation.Generated;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
@Entity
@javax.persistence.TableGenerator(
name="Teacher_GEN",
table="GENERATOR_TABLE",
pkColumnName="pkkey",
valueColumnName="pkvalue",
pkColumnValue="Teacher",
allocationSize=1
)
public class Teacher {
// private int id;
// private String name;
private String title;
private String address;
private String wifeName;
private Date birth;
private ZhiCheng zhiCheng;
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
// public int getId() {
// return id;
// }
// public void setId(int id) {
// this.id = id;
// }
// @Column(name="_name")
// public String getName() {
// return name;
// }
// public void setName(String name) {
// this.name = name;
// }
private TeacherPK pk;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getWifeName() {
return wifeName;
}
public void setWifeName(String wifeName) {
this.wifeName = wifeName;
}
@Temporal(TemporalType.DATE)
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Enumerated(EnumType.STRING)
public ZhiCheng getZhiCheng() {
return zhiCheng;
}
public void setZhiCheng(ZhiCheng zhiCheng) {
this.zhiCheng = zhiCheng;
}
@EmbeddedId
public TeacherPK getPk() {
return pk;
}
public void setPk(TeacherPK pk) {
this.pk = pk;
}
}
(2)測試
(3)查看結果
select * from teacher;
desc teacher;
方法三:
(1)在Teacher.java中修改,在getId(),getName()上添加@Id,在Teacher類名稱上添加@IdClass(value=TeacherPK.class)
package com.zgy.hibernate.model;
import java.util.Date;
import javax.annotation.Generated;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
@Entity
@javax.persistence.TableGenerator(
name="Teacher_GEN",
table="GENERATOR_TABLE",
pkColumnName="pkkey",
valueColumnName="pkvalue",
pkColumnValue="Teacher",
allocationSize=1
)
@IdClass(value=TeacherPK.class)
public class Teacher {
private int id;
private String name;
private String title;
private String address;
private String wifeName;
private Date birth;
private ZhiCheng zhiCheng;
@Id
// @GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="_name")
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private TeacherPK pk;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getWifeName() {
return wifeName;
}
public void setWifeName(String wifeName) {
this.wifeName = wifeName;
}
@Temporal(TemporalType.DATE)
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Enumerated(EnumType.STRING)
public ZhiCheng getZhiCheng() {
return zhiCheng;
}
public void setZhiCheng(ZhiCheng zhiCheng) {
this.zhiCheng = zhiCheng;
}
/*
@EmbeddedId
public TeacherPK getPk() {
return pk;
}
public void setPk(TeacherPK pk) {
this.pk = pk;
}
*/
}
(2)測試
(3)查看結果
select * from teacher;
desc teacher;