a:数据库的相关知识:

(1):一个表能否有多个主键:不能;

(2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性;

(3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键,简单的说为了方便;如果找不到合适的列,除了使用id列以为作为主键,也可以使用联合主键,即多列的值作为一个主键,从而确保了记录的唯一性,即为联合主键;

Hibernate的映射很重要哦,如果是一般的映射,很容易掌握和使用,但是如果是集合映射呢,这里简单使用一下集合映射;

1:第一步,作为使用别人框架的中国人,我们只能先引入别人的包咯,千万别忘记了哦

2:第二步,就是配置hibernate.cfg.xml了,这里的配置之前已经说过了,分三大部分

第一部分,数据库连接配置。

第二部分,其他相关配置。

这里使用了自动创建数据表,update

下面的源码详细介绍了几种方法的区别,如何找到hibernate.hbm2ddl.auto这句话呢,如下所示:

mysql 底层映射bool_mysql字段映射set

第三部分,加载映射文件。

1 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"3 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
4 river10 jdbc:mysql:///test
11 root
12 123456
13
14 
15 org.hibernate.dialect.MySQLDialect
16 true
17 true
18 update
19 
3:第三步,创建实体类,我依次使用了set,list,map集合来完成映射,这里一下全都写到了实体类里面了!!!
1 packagecom.bie.po;2
3 importjava.util.List;4 importjava.util.Map;5 importjava.util.Set;6
7 /**
8 *@authorBieHongLi9 *@version创建时间:2017年3月15日 下午4:07:1810 * 实体类11 */
12 public classUser {13
14 private intid;15 privateString name;16 //一个用户,对应多个地址
17 private Setaddress;18
19 private ListaddressList;20
21 private MapaddressMap;22
23
24 public MapgetAddressMap() {25 returnaddressMap;26 }27 public void setAddressMap(MapaddressMap) {28 this.addressMap =addressMap;29 }30 public ListgetAddressList() {31 returnaddressList;32 }33 public void setAddressList(ListaddressList) {34 this.addressList =addressList;35 }36 public intgetId() {37 returnid;38 }39 public void setId(intid) {40 this.id =id;41 }42 publicString getName() {43 returnname;44 }45 public voidsetName(String name) {46 this.name =name;47 }48 public SetgetAddress() {49 returnaddress;50 }51 public void setAddress(Setaddress) {52 this.address =address;53 }54
55
56
57 }
4:创建好实体类,就可以进行映射配置了,如实体类名.hbm.xml
(1)set集合属性的映射:重点消化
name指定要映射的set集合的属性
table集合属性要映射的表
key指定集合表(t_address)的外键字段
element指定集合表的其他字段
type元素类型,一定要指定
(2)List集合属性的映射
name指定要映射的list集合的属性
table集合属性要映射的表
key指定集合表(t_addressList)的外键字段
element指定集合表的其他字段
type元素类型,一定要指定
list-index是list集合一定要指定的,指定排序列的名称,因为list是有序的
(3) Map映射
name指定要映射的map集合的属性
table集合属性要映射的表
key指定集合表(t_addressMap)的外键字段
element指定集合map的其他字段value
type元素类型,一定要指定
map-key指定map的key
1 <?xml version="1.0"?>
2 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5 
5:映射配置好之后呢,就可以开始进行测试了,这里使用junit进行测试哦~~~
这里需要注意的是最后一个测试获取数据的时候,
只有当使用集合数据的时候,才向数据库发送执行sql的语句(又叫做懒加载)
当查询用户,同时可以获取用户关联的list集合的数据,(因为存在正确映射)
1 packagecom.bie.test;2
3 importjava.util.ArrayList;4 importjava.util.HashMap;5 importjava.util.HashSet;6 importjava.util.List;7 importjava.util.Map;8 importjava.util.Set;9
10 importorg.hibernate.Session;11 importorg.hibernate.SessionFactory;12 importorg.hibernate.Transaction;13 importorg.hibernate.cfg.Configuration;14 importorg.junit.Test;15
16 importcom.bie.po.User;17
18 /**
19 *@authorBieHongLi20 *@version创建时间:2017年3月15日 下午4:31:2321 *22 */
23 public classSetTest {24
25 //私有化session工厂
26 private staticSessionFactory sf;27 static{28 //首先默认加载src/hibernate.cfg.xml文件29 //其次创建session工厂文件
30 sf = newConfiguration()31 .configure()32 //.addClass(User.class),测试的时候可以使用这个代替加载映射文件
33 .buildSessionFactory();34 }35
36 @Test37 public voidtest(){38 //创建session
39 Session session =sf.openSession();40 //创建session开启事务
41 Transaction tx =session.beginTransaction();42
43 //保存
44 Set addressSet = new HashSet<>();45 addressSet.add("北京");46 addressSet.add("上海");47
48 //用户对象
49 User user = newUser();50 user.setName("tom");51 user.setAddress(addressSet);52
53 //保存到session中
54 session.save(user);55
56 tx.commit();57 //session.getTransaction().commit();这样写就不用使用事务tx接受了,更加方便快捷
58 session.close();59 }60
61 @Test62 public voidtest2(){63 //创建session
64 Session session =sf.openSession();65 //开启事务
66 session.beginTransaction();67
68 //List集合保存
69 List list = new ArrayList<>();70 list.add("深圳");71 list.add("广州");72
73 //User用户
74 User user = newUser();75 user.setName("张三");76 user.setAddressList(list);77
78 //保存实体类
79 session.save(user);80
81 //提交事务
82 session.getTransaction().commit();83 //关闭session
84 session.close();85 }86
87 @Test88 public voidtest3(){89 Session session =sf.openSession();90 session.beginTransaction();91
92 Map map = new HashMap();93 map.put("1001", "新乡");94 map.put("1002", "郑州");95
96 User user = newUser();97 user.setName("李四");98 user.setAddressMap(map);99
100 session.save(user);101
102 session.getTransaction().commit();103 session.close();104 }105
106 @Test107 public voidgetList(){108 Session session =sf.openSession();109 session.beginTransaction();110
111 User user = (User)session.get(User.class, 2);112 System.out.println(user.getId());113 System.out.println(user.getName());114
115 //当查询用户,同时可以获取用户关联的list集合的数据,(因为存在正确映射)116 //当使用集合数据的时候,才向数据库发送执行sql的语句(又叫做懒加载)
117 System.out.println(user.getAddressList());118
119 session.getTransaction().commit();120 session.close();121 }122
123 }

演示效果如下所示,需要注意的是,这里使用自动创建表的:

mysql 底层映射bool_mysql字段映射set_02