Hibernate总结3
Hibernate在操纵数据库时,首先要把数据库与java类之间的映射关系配置好
1.一对多的关联关系映射
1.1 客户的映射 (一的一方)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 建立类与表的映射 --> 7 <class name="com.itheima.hibernate.domain.Customer" table="cst_customer"> 8 <!-- 建立类中的属性与表中的主键的对应关系 --> 9 <id name="cust_id" column="cust_id"> 10 <generator class="native"></generator> 11 </id> 12 <!-- 建立类中的普通属性和表的字段的对应 --> 13 <property name="cust_name" column="cust_name"></property> 14 <property name="cust_source" column="cust_source"></property> 15 <property name="cust_industry" column="cust_industry"></property> 16 <property name="cust_level" column="cust_level"></property> 17 <property name="cust_phone" column="cust_phone"></property> 18 <property name="cust_mobile" column="cust_mobile"></property> 19 <!-- 配置一对多的映射,放置多的一方的集合 --> 20 <!--name属性:多的一方的集合名称 --> 21 <set name="linkMans" cascade="save-update,delete"> 22 <!-- column属性是多的一方的外键名称 --> 23 <key column="lkm_cust_id"></key> 24 <!-- class属性是多的一方的全路径 --> 25 <one-to-many class="com.itheima.hibernate.domain.LinkMan"/> 26 </set> 27 </class> 28 </hibernate-mapping>
1.2 联系人的映射(多的一方)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="com.itheima.hibernate.domain.LinkMan" table="cst_linkman"> 7 <id name="lkm_id" column="lkm_id"> 8 <generator class="native"></generator> 9 </id> 10 <property name="lkm_name"></property> 11 <property name="lkm_gender"></property> 12 <property name="lkm_phone"></property> 13 <property name="lkm_mobile"></property> 14 <property name="lkm_email"></property> 15 <property name="lkm_qq"></property> 16 <property name="lkm_position"></property> 17 <property name="lkm_memo"></property> 18 <!-- 配置多对一的映射 --> 19 <!-- 20 name属性是一的一方对象的名称 21 class属性是一的一方的全路径 22 --> 23 <many-to-one cascade="save-update,delete" name="customer" class="com.itheima.hibernate.domain.Customer" column="lkm_cust_id"></many-to-one> 24 </class> 25 </hibernate-mapping>
1.3 将映射添加到配置文件中
1 <mapping resource="com/itheima/hibernate/domain/Customer.hbm.xml"></mapping> 2 <mapping resource="com/itheima/hibernate/domain/LinkMan.hbm.xml"></mapping>
2 多对多关联关系映射
2.1 用户的映射
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="com.itheima.hibernate.domain.User" table="sys_user"> 7 <id name="user_id" column="user_id"> 8 <generator class="native"></generator> 9 </id> 10 <property name="user_code" column="user_code"></property> 11 <property name="user_name" column="user_name"></property> 12 <property name="user_password" column="user_password"></property> 13 <property name="user_state" column="user_state"></property> 14 <!-- 建立与角色之间的关系 --> 15 <!-- 16 set标签: 17 name:关联的另一方的属性名称 18 table:中间表的名称 19 --> 20 <set name="roles" table="sys_user_role"> 21 <!-- 22 key标签 23 column:当前对象在中间表中的外键的名称 24 --> 25 <key column="user_id"></key> 26 <!-- 27 many-to-many标签 28 class:关联的另一方的类的全路径 29 column:关联的另一方在中间表的外键名称 30 --> 31 <many-to-many class="com.itheima.hibernate.domain.Role" column="role_id"></many-to-many> 32 </set> 33 </class> 34 </hibernate-mapping>
2.2 角色的映射
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="com.itheima.hibernate.domain.Role" table="sys_role"> 7 <id name="role_id" column="role_id"> 8 <generator class="native"></generator> 9 </id> 10 <property name="role_name" column="role_name"></property> 11 <property name="role_memo" column="role_memo"></property> 12 <set name="users" table="sys_user_rule" inverse="true"> 13 <key column="role_id"></key> 14 <many-to-many class="com.itheima.hibernate.domain.User" column="user_id"></many-to-many> 15 </set> 16 </class> 17 </hibernate-mapping>
2.3 在核心配置中加入映射文件
1 <mapping resource="com/itheima/hibernate/domain/User.hbm.xml"></mapping> 2 <mapping resource="com/itheima/hibernate/domain/Role.hbm.xml"></mapping>
3 小插曲
在建立项目的时候,因为都是demo性质的程序,偷懒,直接复制了之前的项目改了下名称,不料之前项目中建立的文件位置放错了,把hibernate.cfg.xml文件放在了utils包下,同时在src包下也放了hibernate.cfg.xml文件,但改配置文件时改的都是utils包下的代码,测试程序是报错No CurrentSessionContext configured!,尝试了很多次,查了很多资料都没有解决,差点放弃的时候,发现了问题所在,赶紧把utils 包下文件删除,配置好配置文件程序运行成功
同时在配置文件时应注意如果想用SessionFactory 对象的getCurrentSession()方法,要注意在配置文件中加入
<property name="hibernate.current_session_context_class">thread</property>
这样异常就会解决
使用SessionFactory 对象的openSession()方法不会报错