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


一:联合主键类

联合主键就是靠多个属性一起来决定主键
所以要新建主键类,其中要实现
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))




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值