本文共 5520 字,大约阅读时间需要 18 分钟。
关联关系映射
1)一对多关联关系
Customer <--------->Order一对多双向关联关系,通过Customer可以知道Order,而通过Order同样的也可知道对应的Customer
Public class Customer implements Serilizable{ Private Long id;//--主键自动生成 Private String name; Private Setorders = new HashSet ();//一对多 ....setter/getter.....}Public class Order implements Serilizable{ Private Long id; Private String name; Private Customer customer;//一对多 .....setter/getter....}
Customer.hbm.xmlOrder.hbm.xml
Categary 自身关联一对多
Public class Categary implements Serilizable{ Private Long id;//hibernate自动生成 Private String name; Private Categary parent;//指定一的一方属性; Private Setchildren = 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.xmlIdCard.hbm.xml person
B):外键关联 Person <-------> IdCard
Person.hbm.xmlIdCard.hbm.xml
假设一种情况:Person与IdCard为一对一,而Person与Team 为一对多的关系。
由于一对一默认加载方式为左外连接立即检索,那么如果我需要查询一个IdCard对象,
而此时将会将对应的Person加载出来,同时也会将Person的Team对象查询出来
而进而引发将与Team对应的所有的Person一起查询,
为了查一个数据而附带出很多不需要的查询sql的情况出现.
可以通过配置查询深度来控制。
配置检索深度,需要在主配置文件中配置。hibernate.cfg.xml1
3)多对多关联关系
Student <-----> Course 学生与课程多对多,使用中间表的形式来实现数据库层面的多对多。
Public class Student implements Serilizable{ Private Long id;//hibernate自动生成 Private String name; Private Setcourses = 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.xmlCourse.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 Mapmap1 = new HashMap ();//原子类型 Private Map map2 = new HashMap ();//复杂类型 ....setter/getter....}Public class Student implements Serilizable{ Private Long id;//主键 Private String name; ...setter/getter....}
Team.hbm.xmlStudnt.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 Setdates = 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/