《Hibernate一对多一对一多对多映射之Annotation篇》由会员分享,可在线阅读,更多相关《Hibernate一对多一对一多对多映射之Annotation篇(5页珍藏版)》请在金锄头文库上搜索。
1、Annotation 注解可以放在属性所在行的上方,也可放在对应的属性的 get 方法的上方一、 一对多/多对一1. 确定谁是一方,谁是多方。2.po 代码一方 po 有 set 的属性,部分关键代码Department:IdSequenceGenerator(name=seqDept,sequenceName=seq_t_department)GeneratedValue(generator=seqDept)Column(name=dept_id)private Integer deptId;/* */mappedBy 必须写: 值是对方中本方类型的属性名 inverse:放弃/维护外键 不
2、让系统自动生成中间表/,fetch=FetchType.EAGER 不懒加载 FetchType.LAZY 懒加载OneToMany(mappedBy=department)private Set empSet;多方 po 有一方类型的属性,部分关键代码Employee:IdSequenceGenerator(name=seqEmp,sequenceName=seq_t_employee)GeneratedValue(generator=seqEmp)Column(name=emp_Id)private Integer empId;/* */,cascade=CascadeType.ALLMa
3、nyToOneJoinColumn(name=dept_id)private Department department;二、 一对一1 外键关联:一对多的基础上在 外键字段上加个唯一约束构成 1 对 1 的关系。1.1 确定谁是一方,谁是多方。因为是一对一的关系,所以任何一方是一方或多方都可以2.1 po 双方各有一个对方类型的属性,部分代码一方 Address:IdSequenceGenerator(name=seqAddr,sequenceName=seq_t_address)GeneratedValue(generator=seqAddr)Column(name=dept_id)pri
4、vate Integer addrId;OneToOne(mappedBy=address)private Company company;多方 Company:IdSequenceGenerator(name=seqCompany,sequenceName=seq_t_company)GeneratedValue(generator=seqCompany)Column(name=company_id)private Integer companyId;ManyToOneJoinColumn(name=addr_id,unique=true)private Address address;2.
5、主键关联:双方一对一关系的数据保证主键值一致即可2.1 都是一方2.2 po:双方各 有一个对方类型的属性,并且生成的两个表主键值相同Po 中部分代码:下边是注解书写的另外一种形式Male:private Integer marriageId;private Integer maleId;private Female female;IdSequenceGenerator(name=seqMale,sequenceName=seq_t_male)GeneratedValue(generator=seqMale)Column(name=marriage_Id)public Integer getM
6、arriageId() return marriageId;OneToOne(cascade=CascadeType.ALL)PrimaryKeyJoinColumnpublic Female getFemale() return female;Female:private Integer marriageId;private Integer femaleId;private Male male;/* male*/IdGenericGenerator(name=seqFemale,strategy=foreign,parameters=Parameter(name=property,value
7、=male)GeneratedValue(generator=seqFemale)Column(name=marriage_Id)public Integer getMarriageId() return marriageId;OneToOne(mappedBy=female)public Male getMale() return male;三、 多对多1.中间表里只包含另外两张表的主键字段,没有新字段,此时不需要再写一个 po 类1.1 都是多方1.2 po 中双方各有对方的 set的属性,部分代码如下Course:IdSequenceGenerator(name=seqCourse,se
8、quenceName=seq_t_course)GeneratedValue(generator=seqCourse)Column(name=course_Id)private Integer courseId;ManyToMany(mappedBy=courseSet)private Set stuSet ;Student:IdSequenceGenerator(name=seqStu,sequenceName=seq_t_Student)GeneratedValue(generator=seqStu)Column(name=stu_Id)private Integer stuId;/* *
9、/ManyToManyJoinTable(name=t_student_course,joinColumns=JoinColumn(name=stu_Id),inverseJoinColumns=JoinColumn(name=course_id)private Set courseSet;或者:Course:IdSequenceGenerator(name=seqCourse,sequenceName=seq_t_course)GeneratedValue(generator=seqCourse)Column(name=course_Id)private Integer courseId;M
10、anyToManyJoinTable(name=t_student_course,joinColumns=JoinColumn(name=course_Id),inverseJoinColumns=JoinColumn(name=stu_id)private Set stuSet ;Student:IdSequenceGenerator(name=seqStu,sequenceName=seq_t_Student)GeneratedValue(generator=seqStu)Column(name=stu_Id)private Integer stuId;/* */ManyToManyJoi
11、nTable(name=t_student_course,joinColumns=JoinColumn(name=stu_Id),inverseJoinColumns=JoinColumn(name=course_id)private Set courseSet;前者只有一边可以维护中间表,student 维护中间表后者双方都可以维护中间表2. 中间表里除了包含另外两张表的主键字段外,还有新字段,此时需要再写一个 po 类,如 student 表和 course 表的中间表还包含有成绩字段2.1 双方分别对中间方是一对多,而中间方分别对双方是多对一2.2 要多写一个中间方 po,双方各有对方的
12、 set的属性,中间方有双方的类型属性,并且中间方有自己的主键,部分代码如下中间方:ReceMessageIdColumn(name=rece_Id)SequenceGenerator(name=receSeq,sequenceName=seq_t_rece_message)GeneratedValue(generator=receSeq)private Integer receId;Column(name=read_Status)private Integer readStatus;/读取状态 0:未读 1 已读Column(name=del_Status)private Integer d
13、elStatus;/0:未删除 1:垃圾箱 2:真正删除 /此表乃中间表 跟 emp 表是一对多 此表是多方ManyToOneJoinColumn(name=emp_id)private Emp emp;/此表乃中间表 跟 ZnxMessage 表是一对多 此表是多方ManyToOneJoinColumn(name=message_id)private ZnxMessage znxMessage;一方:EmpIdColumn(name=emp_id)SequenceGenerator(name=empSeq,sequenceName=seq_t_emp)GeneratedValue(gener
14、ator=empSeq)private Integer empId;/跟收信的中间表是一对多 emp 是一方OneToMany(mappedBy=emp)private Set receList;一方:ZnxMessageIdColumn(name=message_id)SequenceGenerator(name=znxMessageSeq,sequenceName=seq_t_znx_message)GeneratedValue(generator=znxMessageSeq)private Integer messageId;/跟收信的中间表 是一对多 此表是一方OneToMany(mappedBy=znxMessage)private Set receSet;注意所有的 hibernate.cfg.xml 的映射文件配置信息格式如下:不用在配置对应 po 的 xml!