• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Hibernate中联合主键生成策略

mysql 搞代码 4年前 (2022-01-09) 24次浏览 已收录 0个评论

一、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 St<strong style="color:transparent">本文来源gaodai#ma#com搞@@代~&码网^</strong>udentPK 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"?><!---ecms -ecms  --><!---ecms -ecms  联合主键的配置方式 -->(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;@[email protected](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;@[email protected](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;


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Hibernate中联合主键生成策略

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址