Hibernate中的复合主键映射(了解)

实际开发中,只有当出现多对多关系时,才有可能出现复合主键的表,例如:学生选课功能,需要设计,学生表,课程表和选课表,其中选课表应该只有两个字段(学生id,课程id),而且应该是复合主键。

但实际开发中,Hibernate推出了多对多关系映射的功能,该功能专门针对多对多关系中间表进行处理,因此复合主键映射在开发中没用了。

这里建立一个中间表,来简单看一下复合主键映射的实现方式,要求了解HQL中类关系查询的形式

先建立两张表:course表和T_User表

CREATE TABLE course (
       cid           number(8)          primary key ,
       title         varchar2(50)       not null                   
);
INSERT INTO course VALUES (1,'Java基本语法•¨');
INSERT INTO course VALUES (2,'JavaWeb开发');
INSERT INTO course VALUES (3,'Java企业级开发');
INSERT INTO course VALUES (4,'Android应用开发');

CREATE TABLE T_User (
       userid         varchar2(40)        primary key , 
       real_name      varchar2(20)        not null,
       password       varchar2(32)        not null,
       regist_date    date                default sysdate,
       last_login_date         date                           
);
INSERT INTO t_USER (userid,real_name,password) VALUES ('zhangsan',‘张三','123');
INSERT INTO t_user (userid,real_name,password) VALUES ('lisi','李四','abc');
commit;
再建立中间表:

create table user_course (
       userid             varchar2(40)      ,
       courseid           number(8) ,
       primary key (userid,courseid)
);
INSERT INTO user_course VALUES ('zhangsan',2);
INSERT INTO user_course VALUES ('zhangsan',4);
INSERT INTO user_course VALUES ('lisi',1);
INSERT INTO user_course VALUES ('lisi',3);
commit;
生成Hibernate映射


主键生成方式可以不选,因为Hibernate认为,只要是复合主键,不可能是自增长的。

生成后会发现,项目下多出了一个Id类,该类出现的原因是因为主键的作用。

主键的作用是唯一标识,保证数据不重复,普通的单字段主键,在映射时,都是映射成普通的数据类型。

但复合主键要比较重复,必须比较多个键都相同,才能算重复。

因此,Hibernate自动生成了id类,并在里面包含了userid和courseid,同时通过覆写equals和hashCode方法,来完成是否重复的比较,这样就可以自动针对id判断是否重复了。

映射文件中也体现了这个关系。

<hibernate-mapping>
    <class name="org.liky.primary.pojo.UserCourse" table="USER_COURSE" schema="SUNXUN">
        <composite-id name="id" class="org.liky.primary.pojo.UserCourseId">
            <key-property name="userid" type="java.lang.String">
                <column name="USERID" length="40" />
            </key-property>
            <key-property name="courseid" type="java.lang.Integer">
                <column name="COURSEID" precision="8" scale="0" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>

编写一个测试类,来看类之间关系的查询。

实现根据某个学生id查询该学生选择的课程信息。
public class Test {
	public static void main(String[] args) {
		 UserCourse uc = new UserCourse(new UserCourseId("zhangsan", 1));
		 UserCourse uc2 = new UserCourse(new UserCourseId("zhangsan", 1));		
		 System.out.println(uc.getId().equals(uc2.getId()));

        	//实现根据某个学生id查询该学生选择的课程信息
		String hql = "FROM UserCourse AS uc WHERE uc.id.userid = ?";
		Query query = HibernateSessionFactory.getSession().createQuery(hql);
		query.setString(0, "zhangsan");
		System.out.println(query.list());
	}
}
注:这里一定要注意,按照类的关系,查找数据,通过UserCourse找到里面的id,再找到里面的userid,作为条件,不要管数据库里表是怎样的设计和关系。

实际开发中,Hibernate推出了多对多关系映射的功能,该功能专门针对多对多关系中间表进行处理,因此复合主键映射在开发中没用了,这里只需要做个了解就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值