집 >데이터 베이스 >MySQL 튜토리얼 >Hibernate中联合主键生成策略
一、xml配置联合主键 单独设计一个类,作为主键类,如StudentPK A、实现序列化(Serializable接口) B、重写equals()和hashCode() 为什么要从写equals()和hashCode()方法? hashCode相同的会被存储在hash表的同一位置,当找到特定的hashcode之后,会根据equa
单独设计一个类,作为主键类,如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(); } }
在联合主键类上,配置@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;
直接在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【本文来自鸿网互联 (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") @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;