自关联:本质还是原来双向一对多,原来要配置两个类,现在全部都配置在一个类里面

Employee

public class Employee {
private Long id;
private String name;
// 多对一: 多个员工对一上级
private Employee manager;
// 一对多:一个领导有多个下级
private Set<Employee> children = new HashSet<Employee>();

Employee.hbm.xml

<class name="Employee" table="t_employee">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- private Employee manager;// 多对一: 多个员工对一上级 -->
<many-to-one name="manager" column="manager_id" class="Employee"/>
<!-- private Set<Employee> children = new HashSet<Employee>();// 一对多:一个领导有多个下级 -->
<set name="children" inverse="true" cascade="save-update">
<key column="manager_id" />
<one-to-many class="Employee" />
</set>
</class>

MainTest

public class MainTest {
Session session = null; @Before
public void save() {
session = HibernateUtils.INSTANCE.getSession();
session.beginTransaction(); Employee boss = new Employee("boss");
Employee manager = new Employee("manager");
Employee emp1 = new Employee("emp1");
Employee emp2 = new Employee("emp2"); manager.addEmployee(emp1).addEmployee(emp2);
boss.addEmployee(manager); session.save(boss); } @Test
public void get() {
Employee boss = (Employee) session.get(Employee.class, 1L);
System.out.println("boss:" + boss.getName());
Set<Employee> employees = boss.getChildren();
for (Employee manager : employees) {
System.out.println("manager:" + manager.getName());
Set<Employee> children = manager.getChildren();
for (Employee employee : children) {
System.out.println("employee:" + employee.getName());
}
}
} @After
public void colse() {
session.getTransaction().commit();
session.close();
}
}

源码地址

https://github.com/je-ge/hibernate

如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!



Hibernate 系列教程9-自关联的更多相关文章

  1. Hibernate 系列教程6-双向多对多

    双向多对多inverse配置 如果关系两边都使用默认inverse=false配置,表示关系两边都可以管理中间表的数据 关系其中一边设置inverse=true配置,表示自己放弃管理中间表关系,由对方 ...

  2. Hibernate 系列教程5-双向多对一

    主要讲解inverse和cascade的用法 cascade定义的是关系两端对象到对象的级联关系: 而inverse定义的是关系和对象的级联关系(管理外键的值). inverse 属性默认是false ...

  3. Hibernate 系列教程17-查询缓存

    在二级缓存配置成功的基础上进行查询缓存配置 Product public class Product { private Long id; private String name; Product.h ...

  4. Hibernate 系列教程16-二级缓存

    pom.xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate- ...

  5. Hibernate 系列教程15-一级缓存

    Product public class Product { private Long id; private String name; Product.hbm.xml <class name= ...

  6. Hibernate 系列教程14-继承-PerTable策略

    Employee public class Employee { private Long id; private String name; HourlyEmployee public class H ...

  7. Hibernate 系列教程13-继承-鉴别器与内连接相结合

    Employee public class Employee { private Long id; private String name; HourlyEmployee public class H ...

  8. Hibernate 系列教程12-继承-Join策略

    Employee public class Employee { private Long id; private String name; HourlyEmployee public class H ...

  9. Hibernate 系列教程11-继承-Single Table策略

    Single Table策略 通过 discriminator鉴别器来区分是父类还是子类 Employee public class Employee { private Long id; priva ...

随机推荐

  1. php 导出 Excel 报错 exception 'PHPExcel_Calculation_Exception' with message

    exception 'PHPExcel_Calculation_Exception' with message '粉丝数据!C2679 -> Formula Error: Operator '= ...

  2. HDU_1245_Saving James Bond_最短路

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 题意:给一个已知直径的圆形岛,然后岛的附近是湖,湖里有一些点,以坐标的形式给出,最外层是矩形的终 ...

  3. ckeditor 插件

    dialog 下面 建立一个 插件.js CKEDITOR.dialog.add("about", function (a) { var aaa = "<form& ...

  4. app/desktop/view/index.html 显示授权标识

    app/desktop/view/index.html 显示授权标识

  5. 关于springboot启动时候报错:springboot Failed to parse configuration class [Application]

    把运行的java类放在一个package下后就不再提示这个错误. 使用的ide是intellij,之前也有因为没有创建package报错的经历,可能这是intellij必须的

  6. 简单的javasrcipt选项卡

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta char ...

  7. BFS详解

    广度优先搜索详解          1. 也称宽度优先搜索,顾名思义,就是将一棵树一层一层往下搜.算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点.BFS是一种完备策略,即只 ...

  8. html5游戏开发框架之lufylegend开源库件学习记录

    下载地址http://lufylegend.com/lufylegend 引用 <script type="text/javascript" src="../luf ...

  9. python多线程,多进程

    线程是公用内存,进程内存相互独立 python多线程只能是一个cpu,java可以将多个线程平均分配到其他cpu上 以核为单位,所以GIL(全局锁,保证线程安全,数据被安全读取)最小只能控制一个核,很 ...

  10. php模拟post 提交表单

    <?php header('Content-type: text/html;charset=UTF-8'); $action=$_REQUEST['action']; //获取验证码 if($a ...