您好,欢迎访问一九零五行业门户网

Hibernate中联合主键生成策略

一、xml配置联合主键 单独设计一个类,作为主键类,如studentpk a、实现序列化(serializable接口) b、重写equals()和hashcode() 为什么要从写equals()和hashcode()方法? hashcode相同的会被存储在hash表的同一位置,当找到特定的hashcode之后,会根据equa
一、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配置联合主键
(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;@beforeclasspublic static void beforeclass(){sf = new annotationconfiguration().configure().buildsessionfactory();}@testpublic 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();}@afterclasspublic 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;@embeddablepublic 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;@beforeclasspublic static void beforeclass(){sf = new annotationconfiguration().configure().buildsessionfactory();}@testpublic 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();}@afterclasspublic 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;}@embeddedidpublic teacherpk getpk() {return pk;}public【本文来自鸿网互联 (http://www.68idc.cn)】 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)@idpublic 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;}/*@embeddedidpublic teacherpk getpk() {return pk;}public void setpk(teacherpk pk) {this.pk = pk;}*/}
(2)测试
(3)查看结果
select * from teacher;
desc teacher;
其它类似信息

推荐信息