Hibernate_映射_关联关系_cascade属性、单向关联

旧城等待, 2022-06-15 21:00 325阅读 0赞
  1. <!-- employee属性,Set集合,表达的是本类与Employee的一对多关系
  2. class属性:关联的实体类型
  3. key子元素:对方表中的外键列(多方的那个表)
  4. inverse属性:
  5. 默认为false,表示本方维护关联关系。
  6. 如果为true,表示本方不维护关联关系。
  7. 只是影响是否能设置外键的值(设成有效值或者是null值),对获取信息没有影响
  8. cascade属性:
  9. 默认为none,代表不级联。
  10. 级联是指操作主对象时,对关联的对象也做相同的操作
  11. 可设为:delete,save-update,all,none ...
  12. -->
  13. <set name="employee" cascade="all">
  14. <key column="departmentId" />
  15. <one-to-many class="Employee" />
  16. </set>
  17. 一对一,一对多,使用级联
  18. cascade属性:
  19. 默认为none,代表不级联。
  20. 级联是指操作主对象时,对关联的对象也做相同的操作
  21. 可设为:delete,save-update,all,none ...
  22. <set name="employee" cascade="all">
  23. <key column="departmentId" />
  24. <one-to-many class="Employee" />
  25. </set>
  26. 双向关联
  27. 单向关联:
  28. 单向多对一
  29. 单向一对多
  30. 单向多对多
  31. 值类型的集合
  32. 集合元素是普通类型
  33. 实体类型的集合
  34. 集合元素是另外一个实体
  35. 一对多 多对一
  36. Department.hbm.xml Employee.hbm.xml
  37. 要说明的信息有: 要说明的信息有:
  38. 1,集合表(员工表) 1,关联的是什么类型
  39. 2,集合外键 2,外键列
  40. 3,集合元素
  41. 关联的实例类型
  42. package cn.itcast.f_hbm_oneToMany;
  43. import java.util.HashSet;
  44. import java.util.Set;
  45. /**
  46. * 部门
  47. *
  48. * @author 风清杨
  49. * @version V3.0
  50. *
  51. */
  52. public class Department {
  53. /** 部门id */
  54. private Integer id;
  55. /** 部门名称 */
  56. private String name;
  57. /** 员工信息 */
  58. private Set
  59. employee = new HashSet
  60. ();// 关联的很多员工
  61. public Integer getId() {
  62. return id;
  63. }
  64. public void setId(Integer id) {
  65. this.id = id;
  66. }
  67. public String getName() {
  68. return name;
  69. }
  70. public void setName(String name) {
  71. this.name = name;
  72. }
  73. public Set
  74. getEmployee() {
  75. return employee;
  76. }
  77. public void setEmployee(Set
  78. employee) {
  79. this.employee = employee;
  80. }
  81. @Override
  82. public String toString() {
  83. return "Department [id=" + id + ", name=" + name + "]";
  84. }
  85. }
  86. package cn.itcast.f_hbm_oneToMany;
  87. /**
  88. * 员工部门
  89. *
  90. * @author 风清杨
  91. * @version V3.0
  92. *
  93. */
  94. public class Employee {
  95. /** 员工编号 */
  96. private Integer id;
  97. /** 员工姓名 */
  98. private String name;
  99. /** 员工部门 */
  100. private Department department;// 关联的部门对象
  101. public Integer getId() {
  102. return id;
  103. }
  104. public void setId(Integer id) {
  105. this.id = id;
  106. }
  107. public String getName() {
  108. return name;
  109. }
  110. public void setName(String name) {
  111. this.name = name;
  112. }
  113. public Department getDepartment() {
  114. return department;
  115. }
  116. public void setDepartment(Department department) {
  117. this.department = department;
  118. }
  119. @Override
  120. public String toString() {
  121. return "Employee [id=" + id + ", name=" + name + "]";
  122. }
  123. }
  124. package cn.itcast.f_hbm_oneToMany;
  125. import org.hibernate.Session;
  126. import org.hibernate.SessionFactory;
  127. import org.hibernate.Transaction;
  128. import org.hibernate.cfg.Configuration;
  129. import org.junit.Test;
  130. /**
  131. * 应用程序操作类
  132. *
  133. * @author 风清杨
  134. * @version V3.0
  135. *
  136. */
  137. public class App {
  138. private static SessionFactory sessionFactory = new Configuration()//
  139. .configure()//
  140. .addClass(Department.class)//
  141. .addClass(Employee.class)//
  142. .buildSessionFactory();
  143. // 保存,有关联关系
  144. @Test
  145. public void testSave() throws Exception {
  146. Session session = sessionFactory.openSession();
  147. Transaction tx = null;
  148. try {
  149. tx = session.beginTransaction();
  150. // ------------------------------------
  151. // 新建对象
  152. Department department = new Department();
  153. department.setName("开发部");
  154. Employee employee1 = new Employee();
  155. employee1.setName("张三");
  156. Employee employee2 = new Employee();
  157. employee2.setName("李四");
  158. // 关联起来
  159. employee1.setDepartment(department);
  160. employee2.setDepartment(department);
  161. department.getEmployee().add(employee1);
  162. department.getEmployee().add(employee2);
  163. // 保存
  164. session.save(department);
  165. session.save(employee1);
  166. session.save(employee2);
  167. // ------------------------------------
  168. tx.commit();
  169. } catch (RuntimeException e) {
  170. tx.rollback();
  171. throw e;
  172. } finally {
  173. session.close();
  174. }
  175. }
  176. // 获取,可以获取到关联的对方
  177. @Test
  178. public void testGet() throws Exception {
  179. Session session = sessionFactory.openSession();
  180. Transaction tx = null;
  181. try {
  182. tx = session.beginTransaction();
  183. // ------------------------------------
  184. // 获取一方数据,并显示另一方信息
  185. //Department department = (Department) session.get(Department.class,
  186. // 1);
  187. // System.out.println(department);
  188. // System.out.println(department.getEmployee());
  189. Employee employee = (Employee) session.get(Employee.class, 1);
  190. System.out.println(employee);
  191. System.out.println(employee.getDepartment());
  192. // ------------------------------------
  193. tx.commit();
  194. } catch (RuntimeException e) {
  195. tx.rollback();
  196. throw e;
  197. } finally {
  198. session.close();
  199. }
  200. }
  201. }
  202. 维护关联关系:
  203. 就是设置外键列的值。
  204. // 解除关联关系
  205. @Test
  206. public void testRemoveRelation() throws Exception {
  207. Session session = sessionFactory.openSession();
  208. Transaction tx = null;
  209. try {
  210. tx = session.beginTransaction();
  211. // ------------------------------------
  212. // 从员工解除
  213. // Employee employee = (Employee) session.get(Employee.class, 1);
  214. // employee.setDepartment(null);
  215. // 从部门解除(与inverse有关系,为false时可以解除)
  216. Department department = (Department) session.get(Department.class,
  217. 1);
  218. department.getEmployee().clear();
  219. session.update(department);
  220. // ------------------------------------
  221. tx.commit();
  222. } catch (RuntimeException e) {
  223. tx.rollback();
  224. throw e;
  225. } finally {
  226. session.close();
  227. }
  228. }
  229. // 删除对象,对关联对象的影响
  230. @Test
  231. public void testDelete() throws Exception {
  232. Session session = sessionFactory.openSession();
  233. Transaction tx = null;
  234. try {
  235. tx = session.beginTransaction();
  236. // ------------------------------------
  237. // 删除员工方(多方)对对方没有影响
  238. // Employee employee = (Employee) session.get(Employee.class, 2);
  239. // session.delete(employee);
  240. // 删除部门方(一方)
  241. // a,如果没有关联的员工:
  242. // b,如果有关联的员工且inverse=true,由于不能维护关联关系,所以会直接执行删除,就会有异常。
  243. // c,如果有关联的员工且inverse=false,由于可以维护关联关系,它就会先把关联的员工的外键列设为null值,再删除自已。
  244. Department department = (Department) session.get(Department.class,
  245. 1);
  246. // department.getEmployee().clear();
  247. session.delete(department);
  248. // ------------------------------------
  249. tx.commit();
  250. } catch (RuntimeException e) {
  251. tx.rollback();
  252. throw e;
  253. } finally {
  254. session.close();
  255. }
  256. }

发表评论

表情:
评论列表 (有 0 条评论,325人围观)

还没有评论,来说两句吧...

相关阅读