博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)
阅读量:5077 次
发布时间:2019-06-12

本文共 7058 字,大约阅读时间需要 23 分钟。

a:数据库的相关知识:

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

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

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

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

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

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

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

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

    这里使用了自动创建数据表, <property name="hibernate.hbm2ddl.auto">update</property>

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

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

1  4  5 
6
7
8
9
com.mysql.jdbc.Driver
10
jdbc:mysql:///test
11
root
12
123456
13 14
15
org.hibernate.dialect.MySQLDialect
16
true
17
true
18
update
19
32 33
34
35 36
37
38 39 40

3:第三步,创建实体类,我依次使用了set,list,map集合来完成映射,这里一下全都写到了实体类里面了!!!

1 package com.bie.po; 2  3 import java.util.List; 4 import java.util.Map; 5 import java.util.Set; 6  7 /**  8 * @author BieHongLi  9 * @version 创建时间:2017年3月15日 下午4:07:18 10 * 实体类11 */12 public class User {13 14     private int id;15     private String name;16     //一个用户,对应多个地址17     private Set
address;18 19 private List
addressList;20 21 private Map
addressMap;22 23 24 public Map
getAddressMap() {25 return addressMap;26 }27 public void setAddressMap(Map
addressMap) {28 this.addressMap = addressMap;29 }30 public List
getAddressList() {31 return addressList;32 }33 public void setAddressList(List
addressList) {34 this.addressList = addressList;35 }36 public int getId() {37 return id;38 }39 public void setId(int id) {40 this.id = id;41 }42 public String getName() {43 return name;44 }45 public void setName(String name) {46 this.name = name;47 }48 public Set
getAddress() {49 return address;50 }51 public void setAddress(Set
address) {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 
2 5 6
7
8
9
10
11
12
13
14 15
23
24
25
26
27 28 29
38
39
40
41
42
43 44
53
54
55
56
57
58 59 60
61

5:映射配置好之后呢,就可以开始进行测试了,这里使用junit进行测试哦~~~

  这里需要注意的是最后一个测试获取数据的时候,

  只有当使用集合数据的时候,才向数据库发送执行sql的语句(又叫做懒加载)

  当查询用户,同时可以获取用户关联的list集合的数据,(因为存在正确映射)

1 package com.bie.test;  2   3 import java.util.ArrayList;  4 import java.util.HashMap;  5 import java.util.HashSet;  6 import java.util.List;  7 import java.util.Map;  8 import java.util.Set;  9  10 import org.hibernate.Session; 11 import org.hibernate.SessionFactory; 12 import org.hibernate.Transaction; 13 import org.hibernate.cfg.Configuration; 14 import org.junit.Test; 15  16 import com.bie.po.User; 17  18 /**  19 * @author BieHongLi  20 * @version 创建时间:2017年3月15日 下午4:31:23  21 *  22 */ 23 public class SetTest { 24  25     //私有化session工厂 26     private static SessionFactory sf; 27     static{ 28         //首先默认加载src/hibernate.cfg.xml文件 29         //其次创建session工厂文件 30         sf = new Configuration() 31                 .configure() 32                 //.addClass(User.class),测试的时候可以使用这个代替加载映射文件
33 .buildSessionFactory(); 34 } 35 36 @Test 37 public void test(){ 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 = new User(); 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 @Test 62 public void test2(){ 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 = new User(); 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 @Test 88 public void test3(){ 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 = new User(); 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 void getList(){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 }

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

如果生活也是这般,有简到难,该多好~~~

转载于:https://www.cnblogs.com/biehongli/p/6555994.html

你可能感兴趣的文章
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>
VIM工具
查看>>
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>
url查询参数解析
查看>>
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
02太空飞行计划问题
查看>>
原生js日历
查看>>
Linux FIO
查看>>
php 常用函数
查看>>
Sublime_text3怎么运行php代码
查看>>