1.映射文件中,列的类型值一般都不需要写,会自动识别的,但是text型和date型一般都要写出来。
2.引擎问题,MySQLINOODBdIALECT引擎是支持事物和主键的,但是MySQLmyisamDialect引擎不支持,这个引擎只是查询数据比较快。
3. 简单的集合
<!-- set集合 name值是你类中的一个属性值 table 是你执行程序后,生成的表名--> (hashset无序,linkedhashset有序,不重复)
<set name="addressSet" table="user_address">
<key column="userid"></key> <!-- 表的字段 -->
<element type="string" column="address"></element>
</set>
<!-- list集合 跟set集合就多了一个list-index,name值是你类中的一个属性值 table 是你执行程序后,生成的表名-- --> 有序 可以重复
<list name="addressSet" table="user_address">
<key column="userid"></key>
<list-index column="idx"></list-index>
<element type="string" column="address"></element>
</list>
<!-- map集合值,与上面差不多,就多了一个map-key键值对 -->(hashmap无序,linkedhashmap有序,不重复)
<map name="" table="">
<key column=""></key>
<map-key type=""></map-key>
<element></element>
</map>
4.order-by (跟字段名 Desc/Asc) 如:order-by="address desc"
5.多对一和一对多
<class name="Department" table="department">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--外键在多的一方,employeeSet属性,Set集合,表达的是本类与Employee的一对多关系
class属性:写的是多的一方的类
column属性:写的是多的一方的名称
inverse:
默认是false:表示本类关联关系;
true:表示本类不关联关系;
只是影响能否设置外键的值,不影响查询数据,(设置有效值或者是null值)
当你解除关联关系的时候,你从员工方解除的时候,
直接设置你的值为null就可以了,因为你的inverse设置的是true,
就说明你的关联关系是员工方设置。
但是当你在部门方解除关联关系的时候,你需要设置你的inverse值为false,
这样你才有权限去设置值。
删除员工方,(多方) 对对方没有影响
删除部门方 (一方)虽然也可以删除,但是首先是将员工方的值设置为null
然后才能正常删除
-->
<set name="employeeSet" inverse="true">
<key column="departmentId"></key>
<one-to-many class="Employee"/>
</set>
==========================================================================
<class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--department属性,表达的是本类与Department的多对一关系
class属性:写的是少的一方的类
column:外键列
-->
<many-to-one name="department" class="Department" column="departmentId">
</many-to-one>
6.多对多的关联关系 (这个也需要设置inverse属性,否者 如果不设置的话,就需要你在
添加数据的时候,你要两边都添加数据,否者的话就会出现这样的错误
)
<!-- 这个类是student类 -->
<!-- teachers属性,set集合,表达的是本类与Teacher的多对多
table: 这里表示的是中间表
key:集和外键,(引用当前表主键的那个外键)
-->
<set name="teachers" table="teacher_student">
<key column="studentId"></key>
<many-to-many class="Teacher" column="teacherId"></many-to-many>
</set>
============================================
<!-- 这个类是Teacher类 -->
<!--students属性,set集合,本类与Student类的多对多
table: 这里表示的是中间表
key:集和外键,(引用当前表主键的那个外键)
-->
<set name="students" table="teacher_student">
<key column="teacherId"></key>
<many-to-many class="Student" column="studentId"></many-to-many>
</set>
7.关联关系的设置信息:
1,没有关联对方的话,能删除。
2,有关联的话且inverse=flase,由于可以维护关联关系,他就会把有关联关系的对象的外键设置null值,再删除自己。
3,有关联的话且inverse=true,由于不能维护关联关系,所有就会直接执行删除自己,就会有异常
8. 级联的关系:(一般一对多或者一对一使用的比较多,多对多方式使用的少,不然删除一方,另外一方也会删除。)
关联关系的表,其实最直接的方法,就使用级联的方式,可以直接删除,
跟inverse和外键没有关系。
cascade="" delete (删除对象的时候,关联的对象也直接删除)
9.外键约束和唯一性约束
<!-- 外键约束和唯一性约束 -->
<!--person属性,Person类型,表达的是本类与Person的一对一
采用外键的方式一对一映射关系,本方有外键。
unique属性:设置为唯一值,不可以修改,用在身份证中
-->
<many-to-one name="person" class="Person" column="personId" unique="true"/>
<!-- idCard属性,IdCard类型,本类与IdCard的一对一
property-ref:对方映射中,外键的属性名字
-->
<one-to-one name="idCard" class="IdCard" property-ref="person"/>
10. HQL语句没有写仔细
hql="select e.name,count(e.id) as c"+
"from Employee e"+
"where id<9"+
"group by e.name"+
"having count(e.id)>1"+ 在having子句中不能使用列别名就是前面写的 c
"order by c ASC"; 可以使用列别名
11.懒加载:
也叫延迟加载,不是在执行获取操作时马上生成SQL,而是在第一次使用时生成SQL
分成两种:
类级别的;
<class 。。。。lazy=“true/flase”>
属性级别的:
<set/list/map/bag ....lazy="...">
<many-to-one ....lazy="...">
<one-to-one ....lazy="...">
在使用懒加载 特性时,可能会有lazyinitialzationEXCEPTION
原因 :
真正去获取数据时,session已经没有了,
解决办法:
方法一:让session在真正加载后在关闭
方法二:或是在session关闭前执行hibernate。initialize
12.使用二级缓存,默认是打开的
2.引擎问题,MySQLINOODBdIALECT引擎是支持事物和主键的,但是MySQLmyisamDialect引擎不支持,这个引擎只是查询数据比较快。
3. 简单的集合
<!-- set集合 name值是你类中的一个属性值 table 是你执行程序后,生成的表名--> (hashset无序,linkedhashset有序,不重复)
<set name="addressSet" table="user_address">
<key column="userid"></key> <!-- 表的字段 -->
<element type="string" column="address"></element>
</set>
<!-- list集合 跟set集合就多了一个list-index,name值是你类中的一个属性值 table 是你执行程序后,生成的表名-- --> 有序 可以重复
<list name="addressSet" table="user_address">
<key column="userid"></key>
<list-index column="idx"></list-index>
<element type="string" column="address"></element>
</list>
<!-- map集合值,与上面差不多,就多了一个map-key键值对 -->(hashmap无序,linkedhashmap有序,不重复)
<map name="" table="">
<key column=""></key>
<map-key type=""></map-key>
<element></element>
</map>
4.order-by (跟字段名 Desc/Asc) 如:order-by="address desc"
5.多对一和一对多
<class name="Department" table="department">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--外键在多的一方,employeeSet属性,Set集合,表达的是本类与Employee的一对多关系
class属性:写的是多的一方的类
column属性:写的是多的一方的名称
inverse:
默认是false:表示本类关联关系;
true:表示本类不关联关系;
只是影响能否设置外键的值,不影响查询数据,(设置有效值或者是null值)
当你解除关联关系的时候,你从员工方解除的时候,
直接设置你的值为null就可以了,因为你的inverse设置的是true,
就说明你的关联关系是员工方设置。
但是当你在部门方解除关联关系的时候,你需要设置你的inverse值为false,
这样你才有权限去设置值。
删除员工方,(多方) 对对方没有影响
删除部门方 (一方)虽然也可以删除,但是首先是将员工方的值设置为null
然后才能正常删除
-->
<set name="employeeSet" inverse="true">
<key column="departmentId"></key>
<one-to-many class="Employee"/>
</set>
==========================================================================
<class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--department属性,表达的是本类与Department的多对一关系
class属性:写的是少的一方的类
column:外键列
-->
<many-to-one name="department" class="Department" column="departmentId">
</many-to-one>
6.多对多的关联关系 (这个也需要设置inverse属性,否者 如果不设置的话,就需要你在
添加数据的时候,你要两边都添加数据,否者的话就会出现这样的错误
)
<!-- 这个类是student类 -->
<!-- teachers属性,set集合,表达的是本类与Teacher的多对多
table: 这里表示的是中间表
key:集和外键,(引用当前表主键的那个外键)
-->
<set name="teachers" table="teacher_student">
<key column="studentId"></key>
<many-to-many class="Teacher" column="teacherId"></many-to-many>
</set>
============================================
<!-- 这个类是Teacher类 -->
<!--students属性,set集合,本类与Student类的多对多
table: 这里表示的是中间表
key:集和外键,(引用当前表主键的那个外键)
-->
<set name="students" table="teacher_student">
<key column="teacherId"></key>
<many-to-many class="Student" column="studentId"></many-to-many>
</set>
7.关联关系的设置信息:
1,没有关联对方的话,能删除。
2,有关联的话且inverse=flase,由于可以维护关联关系,他就会把有关联关系的对象的外键设置null值,再删除自己。
3,有关联的话且inverse=true,由于不能维护关联关系,所有就会直接执行删除自己,就会有异常
8. 级联的关系:(一般一对多或者一对一使用的比较多,多对多方式使用的少,不然删除一方,另外一方也会删除。)
关联关系的表,其实最直接的方法,就使用级联的方式,可以直接删除,
跟inverse和外键没有关系。
cascade="" delete (删除对象的时候,关联的对象也直接删除)
9.外键约束和唯一性约束
<!-- 外键约束和唯一性约束 -->
<!--person属性,Person类型,表达的是本类与Person的一对一
采用外键的方式一对一映射关系,本方有外键。
unique属性:设置为唯一值,不可以修改,用在身份证中
-->
<many-to-one name="person" class="Person" column="personId" unique="true"/>
<!-- idCard属性,IdCard类型,本类与IdCard的一对一
property-ref:对方映射中,外键的属性名字
-->
<one-to-one name="idCard" class="IdCard" property-ref="person"/>
10. HQL语句没有写仔细
hql="select e.name,count(e.id) as c"+
"from Employee e"+
"where id<9"+
"group by e.name"+
"having count(e.id)>1"+ 在having子句中不能使用列别名就是前面写的 c
"order by c ASC"; 可以使用列别名
11.懒加载:
也叫延迟加载,不是在执行获取操作时马上生成SQL,而是在第一次使用时生成SQL
分成两种:
类级别的;
<class 。。。。lazy=“true/flase”>
属性级别的:
<set/list/map/bag ....lazy="...">
<many-to-one ....lazy="...">
<one-to-one ....lazy="...">
在使用懒加载 特性时,可能会有lazyinitialzationEXCEPTION
原因 :
真正去获取数据时,session已经没有了,
解决办法:
方法一:让session在真正加载后在关闭
方法二:或是在session关闭前执行hibernate。initialize
12.使用二级缓存,默认是打开的