在学习hibernate时,联合主键有两种实现方式:
1.xml实现;
2.注解实现.
在定义联合主键时,我们需要为主键定义一个类,同时在包含该主键的类上定义该主键累的对象,需要说明的是
该联合主键类必须实现Serializable接口,不然有可能在对象缓存时会出现问题。
下面我们来举例:
此处又一学生类:
package ly.suse.model; //学生类 public class Student { //定义主键对象 private StudentPK pk; public StudentPK getPk() { return pk; } public void setPk(StudentPK pk) { this.pk = pk; } private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
该学生类中的主键即为StudentPK。
然后来看主键类的实现:
package ly.suse.model; import java.io.Serializable; //主键类,用联合主键记得重写equals and hashcode public class StudentPK implements Serializable { private int id; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } //重写equals方法 @Override public boolean equals(Object obj) { if(obj instanceof StudentPK){ StudentPK pk = (StudentPK) obj; if(this.id == pk.getId()&&this.name.equals(pk.getName())){ return true; } } return false; } //重写hashcode方法 @Override public int hashCode() { return this.name.hashCode(); } }
然后就是在Student.hbm.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="org.hibernate.tutorial.domain"> <class name="ly.suse.model.Student" table="student"> <!--使用composite-id元素来申明联合主键,name指明该主键在该类中的属性名称,class指明该主键的类--> <composite-id name="pk" class="ly.suse.model.StudentPK"> <!--key-property指明该主键类所拥有的属性,name指明该属性名称 --> <key-property name="id" /> <key-property name="name" /> </composite-id> <property name="age"></property> </class> </hibernate-mapping>
这样我们就写好了联合主键的xml实现方式:
这里我们测试一下写了一个测试类:
import ly.suse.model.Student; import ly.suse.model.StudentPK; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class StudentTest { public static void main(String[] args) { //定义主键类对象 StudentPK pk = new StudentPK(); //定义Student对象 Student s = new Student(); //设置主键属性 pk.setId(3); pk.setName("zhangsan"); //将该主键设置到s对象中 s.setPk(pk); s.setAge(1); //获取hibernate配置对象 Configuration cfg = new Configuration(); //创建hibernate SessionFactory对象 SessionFactory sf = cfg.configure().buildSessionFactory(); //用SessionFactory创建Session对象 Session session = sf.openSession(); //开始事务申明 Transaction tx = session.beginTransaction(); //保存s对象 session.save(s); //提交事务 tx.commit(); //关闭session关闭资源 session.close(); //关闭SessionFactory sf.close(); } }
测试完全通过,只不过要注意这里我没有student这张表,但在hibernate配置是是配置为update,主键在这里没有单独生成一张表哦!
+----+----------+------+
| id | name | age |
+----+----------+------+
| 3 | zhangsan | 1 |
+----+----------+------+