hibernate第三天
表的关系
三种:一对多;多对多;一对一(少用)。
一对多:一个客户有多个联系人;多个联系人属于一个公司。
多对多:一个角色有多个特权;一个特权属于多个用户。
一对多操作(映射配置)
//Hibernate要求使用集合来表示多的数据,用set集合
private Set<LinkMan> setLinkMan = new HashSet<LinkMan>(); 生成属性set & get 方法。
<!-- set name值:在客户实体类中表示联系人的set集合名称 --> <set name="setLinkMan"> <!-- 一对多建表,有外键 Hibernate机制:双向维护建表,在一和多那一方都配置外键 column属性值:外键名称 customer+linkman+id --> <key column="clid"></key> <!-- 客户所有联系人,class里面写联系人实体类全路径 --> <one-to-many class="cn.itcast.entity.LinkMan"/> </set>
private Customer customer;
<!-- 表示联系人所属客户 name:写customer名称 column:外键名称 --> <many-to-one name="customer" class="cn.itcast.entity.Customer" column="clid"></many-to-one>
核心配置文件中配置:



Customer ct = new Customer(); ct.setCustName("baidu"); ct.setCustLevel("vip"); ct.setCustMobile("1231"); ct.setCustPhone("020"); ct.setCustSource("网络"); LinkMan lk = new LinkMan(); lk.setLkm_name("small"); lk.setLkm_gender("girl"); lk.setLkm_phone("1314");
//级联添加 ct.getSetLinkMan().add(lk); lk.setCustomer(ct); session.save(ct); session.save(lk);
//简单代码 ct.getSetLinkMan().add(lk); session.save(ct);
//删除代码 Customer ct = session.get(Customer.class, 3); session.delete(ct);
//更新多的一方外键
Customer bd = session.get(Customer.class, 1); LinkMan man = session.get(LinkMan.class, 4); bd.getSetLinkMan().add(man); man.setCustomer(bd);
性能问题
重复执行两次
解决办法:设置inverse=true

只操作一次

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.itcast.manytomany.User" table="user"> <id name="user_id" column="user_id"> <generator class="native"/> </id> <!-- 3.配置其他属性和表对应 --> <!-- 不需要再配ID 重要 重复定义!!。。。。 --> <property name="user_name" column="user_name"></property> <property name="user_password" column="user_password"></property> <!-- set name值是角色set集合名 table值:第三张表表名 --> <set name="setRole" table="user_role" cascade="save-update"> <!-- key column 第三张表外键名--> <key column="userid"></key> <!-- class:角色实体类全路径 column:角色在第三张表外键名 --> <many-to-many class="cn.itcast.manytomany.Role" column="roleid" ></many-to-many> </set> </class> </hibernate-mapping>
//插入
user1.getSetRole().add(role1);
user1.getSetRole().add(role2);
user2.getSetRole().add(role2);
user2.getSetRole().add(role3);
session.save(user1);
session.save(user2);

User user =session.get(User.class, 1); Role role =session.get(Role.class, 3); //让用户拥有角色 //user.getSetRole().add(role); //让用户没有角色 user.getSetRole().remove(role);
浙公网安备 33010602011771号