就是当一个表里面的一个字段不能唯一的标识一行数据的话那么这个时候就需要这个表的多个字段来共同作为主键、这样的主键就叫做复合主键
Hibernate中的复合主键的使用(下面以用户为例、假设用户表中没有主键id、要使用uName和uAddress来共同作为主键)
public class CompositeKey implements Serializable{
private String uName;
private String uAddress;
setter...
getter...
}
public class User implements Serializable{
private Date uBirth;
private Gender gender;
private String uPwd;
//在这个类里面保存复合主键的引用
private CompositeKey key; //我们的主键
setter...
getter...
}
@Test
public void testAdd() throws Exception {
Session session=getSession();
CompositeKey key=new CompositeKey();
key.setuAddress("四川成都");
key.setuName("小波波");
//准备我们的保存数据对象
User user=new User(new Date(1234566),Gender.man,"123", key);
session.save(user);
close();
}
需求:当我们在购买商品的时候、有可能用户处于不同的地点、所以需要填写不同的地址,所以假设一个用户可以对应多个地址(那么这种情况下 用户---->地址之间的关系是一对多)
public class User implements Serializable{
private int uId;
private String uName;
private String uNickName;
private String uTelNum;
//一个用户对应了多个地址 用户和地址之间是 一对多
private Set address=new HashSet();
setter...
getter...
}
这里需要使用上面这个class的id来作为外键
下面这个key表示的是要对应上面的class中的主键
column:表示的是上面的主键对应t_address这个表的外键的名字(随便写都是对的 只不过还是要见名之意
下面就配置地址的这个列了 在集合中配置普通字段都是element
}
@Test
public void testSet() throws Exception {
Session session=getSession();
Set address=new HashSet();
address.add("中国云南");
address.add("中国海南");
address.add("中国甘肃");
address.add("中国河南");
User user=new User(1,"铁蛋","秋红叶落","120",address);
//执行业务逻辑
session.save(user);
close();
}
public class User implements Serializable{
private int uId;
private String uName;
private String uNickName;
private String uTelNum;
//一个用户对应了多个地址 用户和地址之间是 一对多
private List address=new ArrayList();
setter...
getter...
}
List集合和Set集合的区别就是List集合要多一个排序的列
这个列的名字你是可以随便写的 这个是用来排序用的
@Test
public void testList() throws Exception {
Session session=getSession();
List address=new ArrayList();
address.add("中国云南");
address.add("中国海南");
address.add("中国甘肃");
address.add("中国河南");
User user=new User(1,"铁蛋","秋红叶落","120",address);
session.save(user);
close();
}
public class User implements Serializable{
private int uId;
private String uName;
private String uNickName;
private String uTelNum;
private Map address=new HashMap();
}
@Test
public void testMap() throws Exception {
Session session=getSession();
Map address=new HashMap();
address.put("第一个地址","海南三亚");
address.put("第二个地址","海南海口");
address.put("第三个地址","海南文昌");
address.put("第四个地址","四川成都");
User user=new User(1,"铁蛋","秋红叶落","120",address);
session.save(user);
close();
}
需求:用户和身份证的关系使用Hibernate映射文件来描述出来
一个用户只有一个身份证 一个身份证只是对应了一个用户
用户和身份证之间的关系:一对一
public class User {
private int uId;
private String uName;
private String uAddress;
private IdCard idCard;
setter...
getter...
}
public class IdCard {
private String cardNum; //身份证号码
private Date cardTime; //身份证的有效时间
private User user; //一个身份证对应了一个用户
setter...
getter...
}
@Test
public void testOne2One() throws Exception {
//如果是基于外键映射的话那么只能通过有外键的一方来维护没有外键的这一方
//获取我们的Session对象
Session session=getSession();
User user=new User();
user.setuAddress("四川成都...");
user.setuName("小波波");
IdCard idCard=new IdCard();
idCard.setCardNum("510.....7890");
idCard.setCardTime(new Date(1234));
idCard.setUser(user);
session.save(idCard);
close();
}
public class User {
private int uId;
private String uName;
private String uAddress;
private IdCard idCard;
setter...
getter...
}
public class IdCard {
private String cardNum; //身份证号码
private Date cardTime; //身份证的有效时间
private User user; //一个身份证对应了一个用户
//如果是基于主键来进行映射的话那么这里还需要一个字段 就是另外一个表的外键字段
private int uId; //这个就是我们维护的外键
setter...
getter...
}
user
@Test
public void testOne2One() throws Exception {
//如果是基于外键映射的话那么只能通过有外键的一方来维护没有外键的这一方
//获取我们的Session对象
Session session=HibernateUtils.getSession();
User user=new User();
user.setuAddress("四川成都...");
user.setuName("小波波");
IdCard idCard=new IdCard();
idCard.setCardNum("510.....7890");
idCard.setCardTime(new Date(1234));
idCard.setUser(user);
session.save(idCard);
HibernateUtils.close();
}
public class Dept implements Serializable{
private int dId;
private String dName;
private String dDes;
private String dAddress;
private String dTelNum;
//一个部门有多个员工
private Set emps=new HashSet();
setter...
getter...
}
public class Employee implements Serializable{
private int eId;
private String eName;
private String eTelNum;
private String eAddress;
private Dept dept;
setter...
getter..
}.
public class Test_002 {
/**
* 测试下List集合
* @Title: testList
* @Description: TODO
* @param @throws Exception
* @return void
* @throws
*/
@Test
public void testOne2Many() throws Exception {
Session session=HibernateUtils1.getSession();
//初始化员工
Employee employee=new Employee();
employee.seteAddress("xxx");
employee.seteName("开发部");
employee.seteTelNum("112");
Employee employee1=new Employee();
employee1.seteAddress("xxx");
employee1.seteName("开发部");
employee1.seteTelNum("112");
Employee employee2=new Employee();
employee2.seteAddress("xxx");
employee2.seteName("开发部");
employee2.seteTelNum("112");
Employee employee3=new Employee();
employee3.seteAddress("xxx");
employee3.seteName("开发部");
employee3.seteTelNum("112");
Set emps=new HashSet();
emps.add(employee);
emps.add(employee1);
emps.add(employee2);
emps.add(employee3);
Dept dept=new Dept();
dept.setdAddress("18楼3教室");
dept.setdDes("JAVA教学部负责JAVA");
dept.setdName("JAVA教学部");
dept.setdTelNum("110");
dept.setEmps(emps);
session.save(dept);
HibernateUtils1.close();
}
@Test
public void testMany2One() throws Exception {
Session session=HibernateUtils1.getSession();
//因为配置了员工和部门之间的关系 所以这里是可以通过员工来维护部门的
// 维护 :维护的是关联关系 这个所谓的关键关系指的是 两个表之间关联的字段
Employee employee=new Employee();
employee.seteAddress("xxx");
employee.seteName("铁蛋小");
employee.seteTelNum("112");
Dept dept=new Dept();
dept.setdAddress("ddd");
dept.setdDes("dddxxx");
dept.setdTelNum("120");
dept.setdName("开发部111");
employee.setDept(dept);
//最后进行保存数据
session.save(employee);
HibernateUtils1.close();
}
}
程序员------->项目 一对多
项目----------->程序员 一对多
综上所述:程序员和项目 (多对多)
public class Developer implements Serializable{
private int dId;
private String dName;
private String dTelNum;
private Set projects=new HashSet();
setter...
getter..
}.
public class Project implements Serializable{
private int pId;
private String pName;
private String pDes;
private Date startTime;
private Date endTime;
private Set developers=new HashSet();
setter...
getter..
}.
@Test
public void testMany2Many() throws Exception {
Session session=HibernateUtils.getSession();
//首先准备Project
Project project=new Project();
project.setEndTime(new Date(1233444));
project.setStartTime(new Date(1233444));
project.setpName("医院床边信息娱乐系统");
project.setpDes("医院娱乐用的...");
Project project1=new Project();
project1.setEndTime(new Date(1233444));
project1.setStartTime(new Date(1233444));
project1.setpName("医院床边信息娱乐系统111");
project1.setpDes("医院娱乐用的...111");
Project project2=new Project();
project2.setEndTime(new Date(1233444));
project2.setStartTime(new Date(1233444));
project2.setpName("医院床边信息娱乐系统222");
project2.setpDes("医院娱乐用的...222");
Project project3=new Project();
project3.setEndTime(new Date(1233444));
project3.setStartTime(new Date(1233444));
project3.setpName("医院床边信息娱乐系统333");
project3.setpDes("医院娱乐用的...333");
Developer developer=new Developer();
developer.setdName("铁蛋");
developer.setdTelNum("120");
developer.getProjects().add(project);
developer.getProjects().add(project1);
developer.getProjects().add(project2);
developer.getProjects().add(project3);
//这里进行save保存
session.save(developer);
HibernateUtils.close();
}