博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate关联关系(四)
阅读量:4261 次
发布时间:2019-05-26

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

关联关系映射

1)一对多关联关系

   Customer <--------->Order一对多双向关联关系,通过Customer可以知道Order,而通过Order同样的也可知道对应的Customer

Public class Customer implements Serilizable{   Private Long id;//--主键自动生成   Private String name;   Private Set
orders = new HashSet
();//一对多 ....setter/getter.....}Public class Order implements Serilizable{ Private Long id; Private String name; Private Customer customer;//一对多 .....setter/getter....}
Customer.hbm.xml
Order.hbm.xml

 Categary 自身关联一对多

Public class Categary implements Serilizable{   Private Long id;//hibernate自动生成   Private String name;   Private Categary parent;//指定一的一方属性;   Private Set
children = new HashSet
();//指定多的一方的属性   ....setter/getter.....}
Categary.hbm.xml
  
  
  
  
  
  
  
  
  
  
  
  
  
  

2)一对一关联关系

   分为两种情况:

     A):主键关联  Person  <-------> IdCard

Public class Person implememnts Serilizable{  Private Long id;//hibernate 自动生成  Private String name;  Private IdCard idCard;//一对一  ...setter/getter....}Public class IdCard implements Serilizable{  Private Long id;//hibernate自动生成  Private String number;  Private Person person;//一对一  ...setter/getter ....}
Person.hbm.xml
IdCard.hbm.xml
  
  
  
  
  
person  
  
  
  
  
  

B):外键关联  Person  <-------> IdCard

Person.hbm.xml
IdCard.hbm.xml
  
  
  
  
  

假设一种情况:PersonIdCard为一对一,而PersonTeam 为一对多的关系。

  由于一对一默认加载方式为左外连接立即检索,那么如果我需要查询一个IdCard对象,

  而此时将会将对应的Person加载出来,同时也会将Person的Team对象查询出来

  而进而引发将与Team对应的所有的Person一起查询,

  

  为了查一个数据而附带出很多不需要的查询sql的情况出现.

  可以通过配置查询深度来控制。

配置检索深度,需要在主配置文件中配置。hibernate.cfg.xml
1

3)多对多关联关系

   Student  <-----> Course 学生与课程多对多,使用中间表的形式来实现数据库层面的多对多。

Public class Student implements Serilizable{   Private Long id;//hibernate自动生成   Private String name;   Private Set
courses = new HashSet
();//一个学生多个课程   ...setter/getter.....}Public class Course implements Serilizable{ Private Long id;//hibernate自动生成; Private String name; Private Set
students = new HashSet
();//一门课对应多个学生 ....setter/getter....}
Student.hbm.xml
Course.hbm.xml
说明:配置多对多cascade = “all”就会将两张表与中间表关联的数据都删除,而一般的需求是只需要删除一方且同时删除中间表的关联数据即可,因此配置cascade = “save-update”即可。实际应用问题: 在进行保存的时候,会建立一张中间表进行两张表关系的维护, 这样当随便保存哪一方的时候就会在中间表处出现一个插入重复数据 的错误,导致这样原因是: 当保存student对象时,student就会自己去维护多对多的关联关系,所以 同时就会向中间表插入两个表之间关系的数据记录。 而对于crouse对象而言也是同样的道理, 所以就会出现上面所描述的错误。 那么如何解决这个问题呢? 1):在hbm.xml配置文件中,对一方的设置
表示由对方来维护这种多对多关联关系。所以在代码层次上进行保存的时候, 我们就必须要对持有维护关联关系的对象进行保存。 2):在代码层次上进行修改,最终你要保存哪个对象,只需要将两个对象中 进行保存的那个对象进行关联关系的建立即可,对另外一个就不要进行关联关系的建立。

4)集合映射Map

 Team  Student

 分两种情况:

    A):存放的是原子类型(一个映射文件生成两种表,一种存放Team信息,一张表存放其Map映射中的信息)

    B):存放的是复杂类型(复杂类型单独存放在一张表中)

public class Team implements Serilizable{   Private Long id;//hibernate自动生成   Private String name;   Private Map
map1 = new HashMap
();//原子类型   Private Map
map2 = new HashMap
();//复杂类型   ....setter/getter....}Public class Student implements Serilizable{ Private Long id;//主键 Private String name; ...setter/getter....}
Team.hbm.xml
Studnt.hbm.xml则按照正常的配置即可,生成的表student_拥有的字段有:student自己有的字段+(team_id,mapkey)主键

5)集合映射Set List Bag

Team   Person

 分两种情况:

    A):存放的是原子类型(一个映射文件生成两种表,一种存放Team信息,一张表存放其Map映射中的信息)

    B):存放的是复杂类型(复杂类型单独存放在一张表中)

Public class Team implements Serilizable{   Private Long id;   Private String name;   Private Set
dates = new HashSet
();//原子类型 Private Set
students = new HashSet
();//复杂类型 Private List
lists = new ArrayList
();//原子类型 Private List
ss = new ArrayList
()://复杂类型 ....setter/getter..}Public class Student implements Serilizable{ Private Long id;//主键 Private String name; ...setter/getter....}

转载地址:http://lhxei.baihongyu.com/

你可能感兴趣的文章
设置cmd命令窗口的起始位置
查看>>
写给四年前刚开始编程的自己
查看>>
谷歌面试题,你敢回答吗。
查看>>
Android 安全攻防(一):SEAndroid的编译
查看>>
Android 安全攻防(二): SEAndroid bionic
查看>>
cuda如何做软连接切换
查看>>
小飞机的一些设置解释
查看>>
目标检测里正负样本和数据增广
查看>>
python和C++的交互方式
查看>>
ubuntu快捷键
查看>>
npaint (31M)-图片去水印等
查看>>
学英语以及中文快速阅读的启迪,从“为什么全世界只有中日两个国家弹幕视频网站成为流行?”说开去
查看>>
什么是人工神经网络
查看>>
神经网络的发展历史
查看>>
TED演讲:Jeff Hawkins.大脑的工作原理是什么
查看>>
所谓的语义信息
查看>>
Predictive learning vs. representation learning
查看>>
android SDK工具下载
查看>>
Hibernateday02表的唯一外键
查看>>
Hibernateday06 SQLQuery 和NameQuery
查看>>