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

本文深入探讨了联合主键的概念及其在数据库设计中的重要性,通过实例展示了如何在实体类中实现联合主键,并利用注解完成数据库映射。同时,介绍了JUnit测试方法验证联合主键的正确性,最终生成主键并存入数据库。


一:联合主键类

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




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值