`

Hibernate 自关联注解方式

 
阅读更多

今天下午搞了个使用注解的自连接一对多,以前用的都是配置文件,突然间用注解,一下子没找到方向,所以记录下来。

主要是现实一个多级菜单。

表结构:

Sql代码  收藏代码
  1. create table SMS_MENU  
  2. (  
  3.   ID     NUMBER not null--pk  
  4.   NAME   VARCHAR2(255), --菜单名  
  5.   LINK   VARCHAR2(255),--菜单链接  
  6.   GRADE  NUMBER,--菜单等级  
  7.   PID    NUMBER,  --fk reference SMS_MENU(ID) 父菜单id  
  8.   MORDER NUMBER --同一级菜单的菜单顺序  
  9. )  

 节约点地方,有些没用的getter setter 就不写了。

entity:

 

Java代码  收藏代码
  1. /** 
  2.  * 用户的菜单 
  3.  * @author kenshin 
  4.  * 
  5.  */  
  6. @Entity  
  7. @Table(name = "SMS_MENU")  
  8. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  
  9. public class Menu extends IdEntity {  
  10.   
  11.     private String name;  
  12.     private String link;  
  13.     private Integer grade; //菜单等级  
  14.     private Integer morder; //同一级菜单中的顺序  
  15.   
  16.     private Menu parentMenu;  
  17.     //子菜单列表  
  18.     private List<Menu> childMenu = new ArrayList<Menu>();  
  19.   
  20.     public Menu() {  
  21.         super();  
  22.     }  
  23.   
  24.     @Column(nullable = false, unique = true)  
  25.     public String getName() {  
  26.         return name;  
  27.     }  
  28.   
  29.     @ManyToOne(fetch = FetchType.LAZY)  
  30.     @JoinColumn(name = "pid")  
  31.     public Menu getParentMenu() {  
  32.         return parentMenu;  
  33.     }  
  34.   
  35.     @OneToMany(targetEntity = Menu.class, cascade = { CascadeType.ALL }, mappedBy = "parentMenu")  
  36.     @Fetch(FetchMode.SUBSELECT)  
  37.     @OrderBy("morder")  
  38.     public List<Menu> getChildMenu() {  
  39.         return childMenu;  
  40.     }  
  41.   
  42. }  

 其实不同表的一对多,和自连接的一对多是一样的,只不过突然变成一张表,多方和一方都在一起,我的笨脑子突然没反应过来,所以折腾了多好久。

一个父菜单对应多个子菜单

先把Menu作为”一”的一方看(当做父菜单)

其实它应该有的属性是childMenu这个集合

所以在getChildMenu()方法上有如下如下注解

Java代码  收藏代码
  1. @OneToMany(targetEntity = Menu.class, cascade = { CascadeType.ALL }, mappedBy = "parentMenu")  
  2. @Fetch(FetchMode.SUBSELECT)  
  3. @OrderBy("morder")  

OneToMany自然表示一对多

targetEntity 的参数, 该参数定义了目标实体名.通常不需要定义该参数, 因为在大部分情况下默认值(表示关联关系的属性类型)就可以很好的满足要求了.

也就是说hibernate能通过属性的类型来决定这个值,所以设不设该值问题不大。

cascade表示级联风格,ALL=save-update,delete

最主要的就是mappedBy,我一开始狂找inverse这个属性在哪里设置,就是没找到。

原来在注解的设置中,是使用mappedBy来定义由谁来维护外键的。

在一对多的时候,多的一方是关系维护端,一的一方是关系被维护端。在关系被维护端里面有mappedBy 关系维护方对应的表中应该有外键

在本例中,父菜单所表示的Menu为关系被维护方,所以要在集合上声明mappedBy,表示外键由哪一方维护。

不设置的默认情况下,外键是由一的一方维护的,

Java代码  收藏代码
  1. Menu dsd = entityDao.get(333L);  
  2. Menu m3 = new Menu("A管理""**"13);  
  3. Menu m4 = new Menu("B管理""**"14);  
  4. dsd.addChild(m3);  
  5. dsd.addChild(m4);  
  6. entityDao.save(dsd);  
  7. flush();  
 

如果你调试以上方法,你会发现每一条insert语句后,都会再多一句update语句,虽然在insert语句中已经把pid记录到数据库,但是由于一的一方要维护外键,所以又多了2条update的sql

Sql代码  收藏代码
  1. Hibernate:   
  2.     insert   
  3.     into  
  4.         sms_menu  
  5.         (grade, link, morder, name, pid, id)   
  6.     values  
  7.         (?, ?, ?, ?, ?, ?)  
  8. Hibernate:   
  9.     insert   
  10.     into  
  11.         sms_menu  
  12.         (grade, link, morder, name, pid, id)   
  13.     values  
  14.         (?, ?, ?, ?, ?, ?)  
  15. Hibernate:   
  16.     update  
  17.         sms_menu   
  18.     set  
  19.         pid=?   
  20.     where  
  21.         id=?  
  22. Hibernate:   
  23.     update  
  24.         sms_menu   
  25.     set  
  26.         pid=?   
  27.     where  
  28.         id=?  

 这个非常影响性能

所以必须加上mappedBy="parentMenu"

这句话表示由多的一方自己来维护外键

在多的一方,也就是子菜单对应的Menu,中应该会有一个属性parentMenu指定他的父菜单对象,同时对应的表中的外键列,即PID

这样设置后,调试的结果就只剩下2句insert的sql

Sql代码  收藏代码
  1. Hibernate:   
  2.     insert   
  3.     into  
  4.         sms_menu  
  5.         (grade, link, morder, name, pid, id)   
  6.     values  
  7.         (?, ?, ?, ?, ?, ?)  
  8. Hibernate:   
  9.     insert   
  10.     into  
  11.         sms_menu  
  12.         (grade, link, morder, name, pid, id)   
  13.     values  
  14.         (?, ?, ?, ?, ?, ?)  

 现在自关联就是把父菜单对应的Menu,和子菜单对应的Menu合并成一个对象,

好了自关联的Hibernate注解设置完成了。

分享到:
评论
1 楼 yzh__ 2016-05-24  
学习一个

相关推荐

    Hibernate注解 关联关系映射注解.docx

    在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)的一种方式。本篇文章将详细探讨在Hibernate中如何使用注解来处理各种关联关系,特别是`mappedBy`属性的用法。 首先,`@OneToMany`注解用于表示...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate一对多关联映射(注解)

    总结一下,Hibernate的一对多关联映射通过注解方式定义了对象间的关联关系,使得我们在编程时能够以面向对象的方式操作数据,而底层数据库的操作则由Hibernate自动完成。这种方式大大提高了开发效率,同时也降低了...

    基于注解的关联关系Hibernate

    在这个“基于注解的关联关系Hibernate”的主题中,我们将深入探讨如何使用Hibernate的注解来配置不同类型的关联关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-...

    采用struts2,spring3,hibernate的全注解方式实现的demo

    总之,这个“全注解方式实现的demo”展示了如何整合Struts2、Spring3和Hibernate,利用注解简化配置,提高开发效率。对于初学者,这是一个很好的学习资源,可以深入理解这三大框架的协同工作以及注解在实际项目中的...

    hibernate+spring注解例子

    在`Hibernate`中,我们还可以使用注解来处理关联关系,如`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`,它们分别对应一对一、一对多、多对一和多对多的关系。例如,一个用户可以有多个订单,那么在订单...

    hibernate实体系注解

    使用Hibernate的注解方式,我们可以更直观地在Java代码中定义实体类和它们之间的关系,减少了XML配置的工作量。理解并熟练掌握一对多和多对一的关系映射是Hibernate应用中的关键技能,这有助于构建高效、易于维护的...

    hibernate4全注解例子

    这篇文章主要讲解了如何在Java开发中使用Hibernate4框架,通过注解的方式进行数据库操作。Hibernate4是Java领域中广泛应用的对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来处理数据库操作,极大地...

    HIBERNATE:Hibernate 学习一--注解方式自动建表

    这篇博客"Hibernate学习一--注解方式自动建表"主要探讨了如何使用Hibernate的注解来实现数据库表的自动化创建。 在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中插入信息的方式,这些信息可以被...

    Hibernate注解方式、HQL查询

    本篇将详细探讨Hibernate的注解方式以及HQL(Hibernate Query Language)查询。 一、Hibernate注解方式 1. **实体类注解**:在Hibernate中,我们可以使用注解来定义一个Java类为数据库中的表。例如,使用`@Entity`...

    spring mvc spring4.x hibernate4.注解方式注入

    总的来说,Spring MVC、Spring 4.x和Hibernate 4的注解方式注入大大简化了开发过程,提高了代码的可读性和可维护性。开发者可以通过注解轻松地定义和管理组件之间的关系,降低了项目的复杂度,提升了开发效率。在...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

    hibernate 中文注解

    Hibernate通过注解的方式极大地简化了实体Bean的映射过程,使得开发者能够更专注于业务逻辑的编写。同时,Hibernate还提供了丰富的扩展注解和验证器,进一步增强了其灵活性和可定制性。通过学习并掌握这些注解和配置...

    hibernate 多对多全注解(单向关联、双向关联)

    hibernate关联映射注解多对多单向关联、

    SSH2 annotation 实现struts2.1.6 spring2.5.6 hibernate3.3 全注解开发

    综上所述,SSH2框架的全注解开发是一种高效、灵活的开发方式,它结合了Struts2的MVC处理、Spring的依赖管理和事务控制以及Hibernate的ORM和延迟加载机制,为Java Web应用提供了强大的支撑。通过学习和掌握这些知识点...

    hibernate单向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...

    Hibernate全部注解

    ### Hibernate 全部注解详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,允许开发人员...此外,Hibernate 还提供了更多的高级特性,如关联映射、查询语言等,有兴趣的读者可以进一步学习和探索。

    hibernate _annotation 注解编程

    Hibernate 支持多种元数据定义方式,其中注解方式因其简洁易用而受到广泛欢迎。Hibernate 的注解支持主要通过 Java Persistence API (JPA) 实现。 - **环境设置**: - **需求**:使用 Hibernate 的注解编程方式,...

    基于spring+springmvc+hibernate的全注解开发

    对于字段,`@Column`注解用于映射列,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`则处理关联关系。除此之外,`@Transactional`注解用于声明方法需要在事务中执行。 SSH组合中的全注解开发还有其他一些...

    Hibernate 注解说明文档

    Hibernate注解是一种元数据方式,用于在Java类和属性上声明数据库映射信息,从而避免了XML配置文件的繁琐。注解提供了一种更加简洁、直观的方式来描述实体类和它们与数据库表之间的关系。 1. **@Entity**: 表示一个...

Global site tag (gtag.js) - Google Analytics