现在的位置: 首页 > 综合 > 正文

Hibernate基础之六:联合主键@EmbeddedId

2013年02月24日 ⁄ 综合 ⁄ 共 1432字 ⁄ 字号 评论关闭

一:联合主键类

联合主键就是靠多个属性一起来决定主键
所以要新建主键类,其中要实现
1.Serializable //主键需要传递
2.equals(Object o) //靠主键区分pk,所以必须

3.hashCode()//根据pk的哈希码去查找,所以必须

public class TeacherPK implements Serializable
{
	private int id;
	private String name;//根据这两项属性联合生成主键
	
	public boolean equals(Object o) //靠主键区分pk,所以必须
	{
		if(o instanceof  TeacherPK)
		{
			TeacherPK pk = (TeacherPK)o;//强转
			if(this.id == pk.getId() && this.name.equals(pk.getName()))
			{
				return true;//id和name都分别相等,才是同一主键
			}
		}
		return false;//其余所有情况都返回false
	}

	public int hashCode()//根据pk的哈希码去查找,所以必须
	{
		return this.name.hashCode();	
	}

	
	
	//setter&getter

二:Annotation标注

1.TeacherPK上写@Embeddable
聚合的getPk()上写@Id

2.getPk()上写@EmbeddedId

3.实体上@IdClass(value=TeacherPK.class)
name和id上都要写@Id

@Entity
@Table(name="t_Teacher")
public class Teacher {
	
	private TeacherPK pk;//聚合联合主键

	private int age;
	private Date birthday;
	private String secret;
	private Grade grade;

	//setter&getter
	@EmbeddedId //联合主键的getPK()方法上写 EmbeddedId
	public TeacherPK getPk() {
		return pk;
	}

三:JUnit测试

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        
        TeacherPK pk = new TeacherPK();//组装联合主键
        pk.setId(250);
        pk.setName("张三");
		
        Teacher t = new Teacher();
        t.setPk(pk); //set联合主键
		t.setAge(0);
		t.setBirthday(new Date());
		t.setGrade(Grade.A);
		
        session.save(t);

        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
      

执行后主键就是:primary key (id, name)

DEBUG SchemaUpdate:226 - create table t_Teacher (id number(10,0) not null, name varchar2(255 char) not null, age number(10,0) not null, birthday date, grade varchar2(255 char), primary key (id, name))

抱歉!评论已关闭.