Hibernate中的复合主键映射
来源:互联网 发布:淘宝小蜜投诉有用吗 编辑:程序博客网 时间:2024/05/01 01:00
实际开发中,只有当出现多对多关系时,才有可能出现复合主键的表,例如:学生选课功能,需要设计,学生表,课程表和选课表,其中选课表应该只有两个字段(学生id,课程id),而且应该是复合主键。
先建立一张选课表
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,'JavaEE');
INSERT INTO course VALUES (4,'Android应用开发');
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认为,只要是复合主键,不可能是自增长的。
生成后会发现,多出了一个Id类,该类出现的原因是因为主键的作用。
主键的作用是唯一标识,保证数据不重复,普通的单字段主键,在映射时,都是映射成普通的数据类型。
但复合主键要比较重复,必须比较多个键都相同,才能算重复。
因此,Hibernate自动生成了id类,并在里面包含了userid和courseid,同时通过覆写equals和hashCode方法,来完成是否重复的比较,这样就可以自动针对id判断是否重复了。
映射文件中也体现了这个关系:
<hibernate-mapping>
<classname="org.liky.primary.pojo.UserCourse"table="USER_COURSE"schema="SUNXUN">
<composite-idname="id"class="org.liky.primary.pojo.UserCourseId">
<key-propertyname="userid"type="java.lang.String">
<columnname="USERID"length="40"/>
</key-property>
<key-propertyname="courseid"type="java.lang.Integer">
<columnname="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()));
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中的复合主键映射
- hibernate中的复合主键的映射
- Hibernate中的复合主键映射(了解)
- hibernate中的关联映射图解 ---- 复合主键
- hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- hibernate 复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- Hibernate复合主键映射
- hibernate复合主键映射
- Assembly介绍及使用
- POJ 3734 wata 的快速幂 模板。
- 应用的属性列表info.plist
- 201111621218廖家琦第二周课外作业
- 对数据库DML操作进行封装成简单的工具
- Hibernate中的复合主键映射
- 栈-----括号匹配+表达式计算
- Siege: 发送带Cookie的请求
- OpenCV鼠标控制窗口大小(使用1.0vison)
- 关于YII save() 返回false
- JAVA包装类及其拆箱装箱及Integer类拆装箱的细节
- Android编程之ArrayList源码详解及使用
- leetcode-ZigZag Conversion
- 测试