1、inverse属性:是否反转,默认为false就是不反转然后就是自己维护两方的关系,true就是反转,意思是让对方维护关系。 作用:提高开发的效率
在一对多中,一的一方可以放弃维护提高效率,多的一方必须要维护,因为外键在多的一方。
在多对多中,维护关系理论上随便哪方维护都行,必须要指定只有一方维护不然双方都维护的话,就会在中间表中插入两条一模一样的数据,这时候就会发生冲突,但实际开发中要看具体的业务
例:公司要给新来的员工设置角色,这时候就是由员工来维护双方的关系,因为员工是动态增加或删除的,而公司的角色一般都不会变
2、cascade属性: 默认为none不级联 级联操作(意思就是哪方设置了,这一方的操作或者状态都会让与之关联的对象同步这个状态或操作) 作用:节省写代码的行数(写不写都没什么大关系),建议不要设置,如果业务需求要有的话,最好只用save-update
里面一共有三个可选值(save-update,delete,all)。
save-update:就是保存或更新会让与之关联的对象同步
delete:删除会让与之关联的对象同步
all:以上两种的效果合并
(getset方法自己生成)
一对多的配置方法:
用寝室和学生为例(一个寝室可以有多个学生,一个学生只能属于一个寝室)
Student.java(创建成员变量==》一的一方的引用)
public class Student { private Integer sid; private String studentName; private Dorm dorm; }
Dorm.java(创建成员变量==》多的一方的集合)
public class Dorm { private Integer dormId; //主键 private Set<Student> students = new HashSet<Student>(); }
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ahead.pojo"> <class name="Student" table="student"> <id name="sid" column="sid"> <generator class="native"></generator> </id> <property name="studentName" type="java.lang.String"> <column name="student_name"></column> </property> <!-- many-to-one:name=一的一方的属性名 class=与之关联的全路径类型 (上面配了package可以写类名) column:name=存在数据库中的外键名 --> <many-to-one name="dorm" class="Dorm"> <column name="dorm_id"></column> </many-to-one> </class> </hibernate-mapping>
Dorm.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ahead.pojo"> <class name="Dorm" table="dorm"> <id name="dormId" column="dorm_id"> <generator class="native"></generator> </id> <!-- set:name=集合名称 key:column=多的一方引用我的主键 one-to-many:class=哪个对象与我关联的全路径类名 (上面配了package可以写类名) --> <set name="students" > <key column="dorm_id"> </key> <one-to-many class="Student"/> </set> </class> </hibernate-mapping>
执行测试数据库
一对一的配置方法(其实跟一对多差不多):
用学生和身份证举例 (一个学生只能有一张身份证,一张身份证只能属于一个学生):
Student.java(创建环境变量==》对应一的一方的引用)
public class Student { private Integer sid; private String studentName; //一名学生只有一张身份证 private IdCard idCard; }
IdCard.java(创建环境变量==》对应一的一方的引用)
public class IdCard { private Integer id; //主键 //一张身份证对应一名学生 有外键的一方 private Student student; }
Student.hbm.xml(直接在配置文件配one-to-one就好了)
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ahead.pojo"> <class name="Student" table="student"> <id name="sid" column="sid"> <generator class="native"></generator> </id> <property name="studentName" type="java.lang.String"> <column name="student_name"></column> </property> <one-to-one name="idCard" class="IdCard"></one-to-one> </class> </hibernate-mapping>
IdCard.hbm.xml
注意:哪方是有外键的一方,就要当作多对一来进行配置,其中一定要指定unique="true"
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ahead.pojo"> <class name="IdCard" table="idcard"> <id name="id" column="id"> <generator class="native"></generator> </id> <many-to-one name="student" class="Student" unique="true" > <column name="sid"></column> </many-to-one> </class> </hibernate-mapping>
执行测试数据库:
多对多的配置方法:
以学生和课程做例子(一个学生可以选多门课程,一个课程可以被多名学生选)
理解记忆:先拆分成两边一对多分析就好做了
画图分析多对多的原理
直接贴代码
Student.java(创建成员变量==》对应多的一方的集合)
public class Student { private Integer sid; private String studentName; //多对多,一个学生对应多门课程,一门课程对应多个学生 private Set<Course> courses = new HashSet<Course>(); }
Course.java(创建成员变量==》对应多的一方的集合)
public class Course { private Integer cid; //主键 private String courseName; //课程名称 //多对多,一门课程对应多个学生,一个学生对应多门课程 private Set<Student> students = new HashSet<Student>(); }
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ahead.pojo"> <class name="Student" table="student"> <id name="sid" column="sid"> <generator class="native"></generator> </id> <property name="studentName" type="java.lang.String"> <column name="student_name"></column> </property> <!-- 多对多关系 是一方的配置另外一方也是一样的套路就是相反 name:集合属性名 table:中间表名 key->column:(用一对多的思想来考虑[这里当作一的一方])中间表的外键,别人引用“我”的主键当作外键 class:我与哪个类是多对多关系 这里写那个类的全路径名(上面package写了所以这里可以不用写) column:(用多对一的思想[这里当作多的一方])中间表的外键,我引用别人的主键当作外键(与之关联的实体类的主键) --> <set name="courses" table="stu_middle_cour" inverse="true"> <key column="sid" > </key> <many-to-many column="cid" class="Course"></many-to-many> </set> </class> </hibernate-mapping>
Course.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ahead.pojo"> <class name="Course" table="course"> <id name="cid" column="cid"> <generator class="native"></generator> </id> <property name="courseName" type="java.lang.String"> <column name="course_name" ></column> </property> <set name="students" table="stu_middle_cour"> <key column="cid" /> <many-to-many column="sid" class="Student"></many-to-many> </set> </class> </hibernate-mapping>
启动测试
mysql中的表