1.key是指外键
比如:
2.many开头的是持有外键
3.在many-to-many里,由inverse控制得到主动权后,在 save的对象赋值的时候,不需要双向赋值,只
需要给掌握主动权的对象赋值即可。没有inverse的(比如one-to-one里),需要给双方都赋值,比如
:
4.<one-to-one><one-to-many><many-to-many>都没有 invsere属性,因为inverse属性的意思是是否为
虚的,比如:invere="true"就是表示该表的操作不会影响到关系表。
比如one-to-one中,通过关系表实现
通过关系表实现:
比如:
<hibernate-mapping>
<class name="com.domain.Classes" table="classes" >
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<bag name="studentNames" table="student">
<!-- key对应的都是外键,其意思也就是拿该外键和<id>的主键值匹配,取集合 -->
<key column="classId"></key>
<element column="name" type="string"></element>
</bag>
</class>
</hibernate-mapping>
2.many开头的是持有外键
<hibernate-mapping>
<class name="com.domain.Computer" table="computer" catalog="onetoone">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<!-- many开头的是代表该表持有外键 -->
<many-to-one name="student" class="com.domain.Student" unique="true">
<column name="student_id" />
</many-to-one>
</class>
</hibernate-mapping>
3.在many-to-many里,由inverse控制得到主动权后,在 save的对象赋值的时候,不需要双向赋值,只
需要给掌握主动权的对象赋值即可。没有inverse的(比如one-to-one里),需要给双方都赋值,比如
:
Session session = HibernateSessionFactory.getSession();
Teacher teacher1 = new Teacher();
teacher1.setName("teacher1");
Teacher teacher2 = new Teacher();
teacher2.setName("teacher2");
Teacher teacher3 = new Teacher();
teacher3.setName("teacher3");
Student student1 = new Student();
student1.setName("student1");
Student student2 = new Student();
student2.setName("student2");
//student1.getTeachers().add(teacher1);student1.getTeachers().add
(teacher2);student2.getTeachers().add(teacher1);这几句代码可以不要,因为Teacher掌握主动权
。所以下面几句代码给注释掉了
// //学生一有2个老师
// student1.getTeachers().add(teacher1);
// student1.getTeachers().add(teacher2);
//
// //学生二有一个老师
// student2.getTeachers().add(teacher1);
//因为老师是inverse="false" ,老师掌握主动权
//第一个老师有2个学生
teacher1.getStudents().add(student1);
teacher1.getStudents().add(student2);
//第二个老师有一个学生
teacher2.getStudents().add(student1);
session.saveOrUpdate(teacher1);
session.saveOrUpdate(teacher2);
session.beginTransaction().commit();
session.close();
4.<one-to-one><one-to-many><many-to-many>都没有 invsere属性,因为inverse属性的意思是是否为
虚的,比如:invere="true"就是表示该表的操作不会影响到关系表。
比如one-to-one中,通过关系表实现
通过关系表实现:
DROP TABLE IF EXISTS `st`;
create table stu_com(
stu_id int not null,
com_id int not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
<!--optional="true"的意思是只有当stu_id 和 com_id 都不为空时才在关系表里插入。这样也会插入
2遍,所以需要inverse="true"把一方设置为虚的。即不让插入到关系表中-->
<join table="stu-com" optional="true" inverse="true">
<key column="com_id"/>
<many-to-one name="student" column="stu_id" unique="true"/>
</join>