主键类:
package bean; import java.io.Serializable; import javax.persistence.Embeddable; @Embeddable public class User implements Serializable { private String firstName; private String lastName; public User() { } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @Override public boolean equals(Object obj) { if(obj == null) return false; if(this == obj) return true; if (obj instanceof User) { User user = (User)obj; if(this.firstName == null){ if(user.firstName != null) return false; }else{ if(user.firstName == null) return false; if(!firstName.equals(user.lastName)) return false; } if(this.lastName == null){ if(user.lastName != null) return false; }else{ if(user.lastName == null) return false; if(!lastName.equals(user.lastName)) return false; } }else{ return false; } return true; } @Override public int hashCode() { int result = 17; result = 37 * result + this.firstName.hashCode(); result = 37 * result + this.lastName.hashCode(); return result; } }
引用类:
package bean; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.IdClass; @Entity public class Teacher { private User userId; private String zhicheng; public Teacher() { } public String getZhicheng() { return zhicheng; } public void setZhicheng(String zhicheng) { this.zhicheng = zhicheng; } @EmbeddedId public User getUserId() { return userId; } public void setUserId(User userId) { this.userId = userId; } @Override public boolean equals(Object obj) { if(obj == null) return false; if(obj == this) return true; if(obj instanceof Teacher){ Teacher teacher = (Teacher)obj; if(userId == null){ if(teacher.userId != null) return false; }else{ if(teacher.userId == null) return false; if(!teacher.userId.equals(userId)) return false; } if(zhicheng == null){ if(teacher.zhicheng != null) return false; }else{ if(teacher.zhicheng == null) return false; if(!teacher.zhicheng.equals(zhicheng)) return false; } } return true; } @Override public int hashCode() { int result = 17; result = 37 * result + this.userId.hashCode(); result = 37 * result + this.zhicheng.hashCode(); return result; } }
3.测试类:
package bean; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import util.HibernateUtil; public class TeacherTest { @Test public void saveTeacher(){ Session session = HibernateUtil.getSessionFactory().openSession(); Transaction trans = session.beginTransaction(); try { //新建一个复合主键 User user = new User(); user.setFirstName("Miss"); user.setLastName("Li"); //新建一个Teacher Teacher teacher = new Teacher(); teacher.setZhicheng("3A"); teacher.setUserId(user); session.save(teacher); trans.commit(); } catch (RuntimeException e) { trans.rollback(); e.printStackTrace(); }finally{ session.close(); } } }
配置文件:
<!-- 使用xml配置 --> <mapping resource="bean/Persion.hbm.xml"/> <mapping resource="bean/Event.hbm.xml"/>
<!-- 使用注解配置 --> <mapping class="bean.Email"/> <mapping class="bean.Teacher"/>
作为符合主键类,要满足以下几点要求。
l 必须实现 Serializable 接口。
l 必须有默认的 public 无参数的构造方法。
l 必须覆盖 equals 和 hashCode 方法。 equals 方法用于判断两个对象是否相同, EntityManger 通过 find 方法来查找 Entity 时,是根据 equals 的返回值来判断的。本例中,只有对象的 name 和 email 值完全相同时或同一个对象时则返回 true ,否则返回 false 。 hashCode 方法返回当前对象的哈希码,生成的 hashCode 相同的概率越小越好,算法可以进行优化。