Hibernate 学习笔记(三)

本贴最后更新于 2850 天前,其中的信息可能已经天翻地覆

Hibernate 学习笔记(一对多、多对多操作)

    hibernate 一对多映射配置

    1. 首先创建两个实体类,我便以客户与联系人为例子说明
    2. 两个实体类之间要相互的表示
      (1) 在客户实体类里面有多个联系人

	//hibernate 中要求使用set集合来存储类似这种情况
	private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();

      (2) 一个联系人属于一个客户

	//表示联系人所属于的客户
	private Customer customer;

    3. 映射文件里面配置一对多的关系
      (1) 客户映射文件中表示所有联系人,使用 set 标签表示多个联系人,其中 name 属性填写的是一对多关系中多的一方集合的名字,即填写客户实体类里面客户 set 集合的名称,而里面的 key 标签是指名数据库表的外键名称,<one - to-many> 标签是指明两个实体类的关系为一对多、class 属性填写的是多的一方的实体类路径

  <!-- 在客户的映射文件中表示所有联系人 -->
  <set name="setLinkMan">
	<!-- 一对多建表,有外键
		Hibernate双向维护外键,两方都要配置
		column属性值是外键名称
	-->
	  <key column="clid"></key>
	  <!-- 客户所有的联系人,class里面写联系人实体类全路径 -->
	  <one-to-many class="entity.LinkMan"/>
  </set>

      (2) 在联系人实体类里面表示所属的客户,同样,<many-to-one> 是指明两个实体类的关系,其中 class 指明一的那一方实体类的全路径,而 column 是需要填写外键的名称,也就是之前在客户实体类配置文件里填写的外键

	<!-- 联系人所属的客户 -->
	<many-to-one name="customer" class="entity.Customer" column="clid"></many-to-one>

    4. 在核心配置文件中将两个映射文件引入

    hibernate 一对多级联操作

    1. 级联保存(例如:添加一个客户,为这个客户添加联系人)
      (1) 复杂做法,需要在两个实体类之间相互表示关系,对两张表同时更新

	//创建客户的对象
	Customer customer = new Customer();
	customer.setCustName("it");
	customer.setCustLevel("vip");
	customer.setCustSource("net");
	customer.setCustPhone("110");
	customer.setCustMobile("999");
	//创建联系人对象
	LinkMan linkMan = new LinkMan();
	linkMan.setLkm_name("luck");
	linkMan.setLkm_gender("男");
	linkMan.setLkm_phone("121");
	//建立两个实体类之间的关系
	customer.getSetLinkMan().add(linkMan);
	linkMan.setCustomer(customer);
	//向数据库中存储
	session.save(linkMan);
	session.save(customer);  

      (2) 简化做法,首先需要在多的一方的映射文件中配置,在其 set 标签里加一个属性,cascade 属性,它的值有 save-update、delete 等,分别表示级联更新、级联删除,多个属性之间用逗号隔开如:“save-update,delete”。这时候只需要将联系人加入到客户里面、更新客户即可

	<set name="setLinkMan" cascade="save-update">
	customer.getSetLinkMan().add(linkMan);
	session.save(customer);

    2. 级联删除(例如:删除一个客户,这个客户里面的所有联系人也要删除)
      (1) 需要在配置文件里面配置,参照上文

	<set name="setLinkMan" cascade="save-update,delete">

      (2) 在代码中就可以直接删除客户了

	Customer customer = session.get(Customer.class, 1);
	session.delete(customer);`

    hibernate 中一对多的修改操作

    1. 直接修改会产生一个问题,需要配置一个属性 inverse="true",因为 Hibernate 对外键是双向维护,会对外键进行两次更新,降低了效率,因此将 inverter 属性设置为 true 可以让一的一方放弃维护。

	Customer baidu = session.get(Customer.class, 4);
	LinkMan linkMan = session.get(LinkMan.class, 3);
	baidu.getSetLinkMan().add(linkMan);
	linkMan.setCustomer(baidu);

    hibernate 的多对多操作(例:用户和角色)

    1. 多对多的映射配置
      (1) 创建实体类,用户和角色

	User
	private Integer user_id;
	private String user_Name;
	private String user_password;
	Role
	private Integer role_id;
	private String role_name;
	private String role_memo;

      (2) 一个用户表示多个角色

	private Set<Role> setRole = new HashSet<Role>();

      (3) 一个角色有多个用户

  	private Set<User> setUser = new HashSet<User>();

      (4) 配置多对多关系,与一对多关系中多的一方配置相似

	角色的配置文件
	<set name="setUser" table="user_role" cascade="save-update">
		<!-- 当前映射文件,在第三张表中的外键名称 -->
		<key column="roleid"></key>
		<!-- 
			class属性:角色实体类全路径
			column属性:角色在第三张表的外键名称
		-->
		<many-to-many class="entity.User" column="userid"></many-to-many>
	</set>
	用户的配置文件
	<!-- 在用户里面表示所有的角色 
			name属性:角色set集合的名称
			table属性:第三张表的名称
	-->
	<set name="setRole" table="user_role" cascade="save-update">
		<!-- 当前映射文件,在第三张表中的外键名称 -->
		<key column="userid"></key>
		<!-- 
			class属性:角色实体类全路径
			column属性:角色在第三张表的外键名称
		 -->
		<many-to-many class="entity.Role" column="roleid"></many-to-many>
	</set>

      (5) 在核心配置文件导入映射文件
    2. 多对多的级联保存
      (1) 根据用户保存角色,在用户映射文件里面讲 set 标签里的 cascade 属性设置为 save-update

	 //建立用户
	 User user1 = new User();
	 User user2 = new User();
	 //建立角色
	 Role r1 = new Role();
	 Role r2 = new Role();
	 Role r3 = new Role();
	 //user1有r1\r2的角色
	 user1.getSetRole().add(r1);
	 user1.getSetRole().add(r2);
	 //user2有r2\r3的角色
	 user2.getSetRole().add(r2);
	 user2.getSetRole().add(r3);
	 //保存用户
	 session.save(user1);
	 session.save(user2);  

    3. 多对多的级联删除一般不会去用,因为会导致用户与角色表的数据删除,因此不需要级联删除,只需要去维护第三张关系表就可以了
    4. 维护第三张表
      (1) 让用户有某些角色,直接将用户和角色查出来,在用户的角色集合中添加即可

	User user = session.get(User.class, 3);
	Role role = session.get(Role.class,1);
	user.getSetRole().add(role);

      (2) 让用户没有某些角色,也是直接将用户和角色查出来,在用户的角色集合中删除即可

	User user = session.get(User.class, 3);
	Role role = session.get(Role.class,1);
	user.getSetRole().remove(role);
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 710 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    带个 Hibernate 标签更好分类一些 :)

  • 其他回帖
  • someone

    [em01]列害了

  • someone

    [em01],好的好的