Hibernate联合主键实践

问题描述:

    1.当一个字段作为主键未能标识唯一一条记录,就需要两个字段作为联合主键。

    2.项目设计的时候,往往要在 性能、复杂度、时间方面,做取舍,"联合主键"之类的是比较增加复杂度的东西,尤其是需求有开动。这里只是学习联合主键的使用方法,故暂不考虑这些问题。


例子说明:假设student表中有以下字段: sid、sname、sage、sbirthday等等,这里想实现把sid和sname都做为主键来标识唯一一条记录。

在模型里面的student代码如下:这里的StudentPK实际上是包含了联合主键字段的一个类。

package com.zk.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代码如下:需要注意以下三点

1.实现序列号接口

在写的junit测试类中执行保存数据的时候,如果不实现Serializable接口会提示错误。序列化是java提供的一种保存对象状态的机制,可以方便的保存对象状态再读出来。以下情况一般会需要序列化:

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;     

b)当你想用套接字在网络上传送对象的时候;    

c)当你想通过RMI传输对象的时候;

2.重写equals方法

这里增加了判断条件的限制,为了保证是sid和sname作为主键保证数据的唯一性。

3.重写hashCode方法

package com.zk.model;

public class StudentPK implements java.io.Serializable {
	private int sid;
	private String sname;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	
	@Override //为了保证是通过联合主键来确定唯一的一条记录。
	public boolean equals (Object o)
	{
		if(o instanceof StudentPK)
		{
			StudentPK pk = (StudentPK)o;
			if(this.sid==pk.getSid()&&this.sname.equals(pk.getSname()))
			{
				return true;
			}
			return false;
		}
		return false;
	}
	@Override 
	public int hashCode(){
		return this.sname.hashCode();
		
	}
	
	
}


测试类的代码如下:

package com.zk.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.zk.model.StudentPK;
import com.zk.model.student;

public class test_001 {
	
	public static void main(String[]args)
	{
		StudentPK pk = new StudentPK();
		pk.setSid(5);
		pk.setSname("张三");
		
		student s  = new student();
		s.setPk(pk);
		s.setAge(25);
		
	  Configuration cfg = new Configuration();
	  SessionFactory sf =  cfg.configure().buildSessionFactory();//产生connection的一个集合;
	  Session session = sf.openSession();//数据库的connection
	  session.beginTransaction();
	  session.save(s);
	  session.getTransaction().commit();
	  session.close();
	  sf.close(); 
	}

}



你可能感兴趣的:(java)