- 浏览: 197751 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (121)
- java_基础 (26)
- java_web (15)
- javascript (9)
- extJS (0)
- dwr (0)
- guobin_ETL (1)
- guobin_ssh (17)
- guobin_webservice (1)
- guobin_jbpm (0)
- guobin_jquery (0)
- guobin_acegi (1)
- guobin_poi/jxl (2)
- guobin_multiThread (0)
- guobin_名称解释 (0)
- guobin_FLEX (0)
- guobin_php (0)
- guobin_ORACLE (1)
- guobin_mysql (0)
- guobin_linux (0)
- guobin_powerDesigner (0)
- guobin_visol (0)
- guobin_ER/STUDIO (0)
- guobin_jmesa (0)
- guobin_weblogic (0)
- guobin_kettle (0)
- guobin_一路风雨 (5)
- guobin_spark (0)
- java_xml (7)
- guobin_规则引擎 (0)
- 插件开发 (2)
- 软件管理 (3)
- spring mvc (2)
- java_jni (1)
- eclipse (1)
- oracle (0)
- 项目学习笔记 (1)
- java多线程学习记录 (9)
- websphere性能设置和日常维护 (2)
- (1)
- 系统软件架构设计 (1)
- ces (1)
- 需求分析 (2)
- IBM-CICS GATEWAY (1)
- 工具使用 (1)
- 网络信息安全编程 (1)
最新评论
-
yzh__:
学习一个
Hibernate 自关联注解方式 -
xiaoyahuang:
"2)将Sysdeo Plugin下的DevLoad ...
eclipse项目引用 -
guobin6125:
guobin6125 写道sfasshahhah评论的评论
欢迎使用Kit! -
guobin6125:
sfass
欢迎使用Kit! -
guobin6125:
tst23
欢迎使用Kit!
今天下午搞了个使用注解的自连接一对多,以前用的都是配置文件,突然间用注解,一下子没找到方向,所以记录下来。
主要是现实一个多级菜单。
表结构:
- create table SMS_MENU
- (
- ID NUMBER not null, --pk
- NAME VARCHAR2(255), --菜单名
- LINK VARCHAR2(255),--菜单链接
- GRADE NUMBER,--菜单等级
- PID NUMBER, --fk reference SMS_MENU(ID) 父菜单id
- MORDER NUMBER --同一级菜单的菜单顺序
- )
节约点地方,有些没用的getter setter 就不写了。
entity:
- /**
- * 用户的菜单
- * @author kenshin
- *
- */
- @Entity
- @Table(name = "SMS_MENU")
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
- public class Menu extends IdEntity {
- private String name;
- private String link;
- private Integer grade; //菜单等级
- private Integer morder; //同一级菜单中的顺序
- private Menu parentMenu;
- //子菜单列表
- private List<Menu> childMenu = new ArrayList<Menu>();
- public Menu() {
- super();
- }
- @Column(nullable = false, unique = true)
- public String getName() {
- return name;
- }
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "pid")
- public Menu getParentMenu() {
- return parentMenu;
- }
- @OneToMany(targetEntity = Menu.class, cascade = { CascadeType.ALL }, mappedBy = "parentMenu")
- @Fetch(FetchMode.SUBSELECT)
- @OrderBy("morder")
- public List<Menu> getChildMenu() {
- return childMenu;
- }
- }
其实不同表的一对多,和自连接的一对多是一样的,只不过突然变成一张表,多方和一方都在一起,我的笨脑子突然没反应过来,所以折腾了多好久。
一个父菜单对应多个子菜单
先把Menu作为”一”的一方看(当做父菜单)
其实它应该有的属性是childMenu这个集合
所以在getChildMenu()方法上有如下如下注解
- @OneToMany(targetEntity = Menu.class, cascade = { CascadeType.ALL }, mappedBy = "parentMenu")
- @Fetch(FetchMode.SUBSELECT)
- @OrderBy("morder")
OneToMany自然表示一对多
targetEntity 的参数, 该参数定义了目标实体名.通常不需要定义该参数, 因为在大部分情况下默认值(表示关联关系的属性类型)就可以很好的满足要求了.
也就是说hibernate能通过属性的类型来决定这个值,所以设不设该值问题不大。
cascade表示级联风格,ALL=save-update,delete
最主要的就是mappedBy,我一开始狂找inverse这个属性在哪里设置,就是没找到。
原来在注解的设置中,是使用mappedBy来定义由谁来维护外键的。
在一对多的时候,多的一方是关系维护端,一的一方是关系被维护端。在关系被维护端里面有mappedBy 关系维护方对应的表中应该有外键
在本例中,父菜单所表示的Menu为关系被维护方,所以要在集合上声明mappedBy,表示外键由哪一方维护。
不设置的默认情况下,外键是由一的一方维护的,
- Menu dsd = entityDao.get(333L);
- Menu m3 = new Menu("A管理", "**", 1, 3);
- Menu m4 = new Menu("B管理", "**", 1, 4);
- dsd.addChild(m3);
- dsd.addChild(m4);
- entityDao.save(dsd);
- flush();
如果你调试以上方法,你会发现每一条insert语句后,都会再多一句update语句,虽然在insert语句中已经把pid记录到数据库,但是由于一的一方要维护外键,所以又多了2条update的sql
- Hibernate:
- insert
- into
- sms_menu
- (grade, link, morder, name, pid, id)
- values
- (?, ?, ?, ?, ?, ?)
- Hibernate:
- insert
- into
- sms_menu
- (grade, link, morder, name, pid, id)
- values
- (?, ?, ?, ?, ?, ?)
- Hibernate:
- update
- sms_menu
- set
- pid=?
- where
- id=?
- Hibernate:
- update
- sms_menu
- set
- pid=?
- where
- id=?
这个非常影响性能
所以必须加上mappedBy="parentMenu"
这句话表示由多的一方自己来维护外键
在多的一方,也就是子菜单对应的Menu,中应该会有一个属性parentMenu指定他的父菜单对象,同时对应的表中的外键列,即PID
这样设置后,调试的结果就只剩下2句insert的sql
- Hibernate:
- insert
- into
- sms_menu
- (grade, link, morder, name, pid, id)
- values
- (?, ?, ?, ?, ?, ?)
- Hibernate:
- insert
- into
- sms_menu
- (grade, link, morder, name, pid, id)
- values
- (?, ?, ?, ?, ?, ?)
现在自关联就是把父菜单对应的Menu,和子菜单对应的Menu合并成一个对象,
好了自关联的Hibernate注解设置完成了。
发表评论
-
OpenSessionInViewFilter失效问题解决(SSH2)
2012-07-19 14:07 2318今天在用Hibernate延迟加载时,显示到界面出现如下问题: ... -
hibernate 缓存机制
2012-07-18 11:54 1082CacheConcurrencyStrategy有五种缓 ... -
Spring事务的传播行为和隔离级别[transaction behavior and isolated level]
2012-07-17 23:43 0事务的传播行为和隔离级别[transaction beh ... -
EJB中7个事务属性(PROPAGATION_REQUIRED等)以及5个隔离属性
2012-07-17 23:42 0EJB中7个事务属性(PROPAGATION_REQUI ... -
junit测试之hiberante延迟加载问题
2012-07-17 22:25 0junit测试之hiberante延迟加载问题 ... -
Hibernate 注解对Hibernate属性(CascadeType、JoinColumn、JoinTable、ForeignKey等)的研究
2012-07-17 20:28 6741------------------------------- ... -
Hibernate SQL方言 (hibernate.dialect) Spring配置文件applicationContext.xml
2012-07-17 07:56 8696Hibernate SQL方言 (hibernate.d ... -
hibernate注解 关系映射 -多对多
2012-07-16 23:23 975使用Hibernate Annotations 维护多对 ... -
spring 中配置sqlserver2008
2012-07-16 23:12 1058不得不说的在 MS SQL SERVER 下的 JDBC ... -
BeanCreationException: No unique bean of type
2012-07-16 13:04 1065我定义了一个基类接口BaseDao,下面有些update\sa ... -
Spring BeanBean的作用域及生命周期
2012-06-20 10:25 1737一、Spring Framework支持五种作用域(其中 ... -
Struts 1 和 Struts 2 的线程安全
2012-06-20 10:24 845昨天人问我Struts 2是怎么保证全局变量的线程安全 ... -
学习Spring必学的Java基础知识(1)----反射
2012-05-22 13:40 782http://www.iteye.com/topic/1123 ... -
Hibernate总结篇
2012-04-26 07:47 1359一、HQL经验总结: HQL ... -
Hibernate HQL语句的拼写
2012-04-22 19:11 1043Hibernate HQL语句的拼写 ... -
HQL中如何实现select top n这样的功能?
2012-04-22 19:09 2587HQL中如何实现select top n这样的功能? ... -
使用strtuts2的iterator标签循环输出二维数组和嵌套集合
2012-04-22 17:31 1289其实都一样的嵌套对象跟二维数组。先看看嵌套对象 ... -
hibernate注解 关系映射
2012-04-17 17:12 11001)一对一外键关联映射(单向) @OneToOne(c ... -
Hibernate 注解及简单实例
2012-04-17 16:09 719hibernate注解 1、@Entity(name= ...
相关推荐
在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)的一种方式。本篇文章将详细探讨在Hibernate中如何使用注解来处理各种关联关系,特别是`mappedBy`属性的用法。 首先,`@OneToMany`注解用于表示...
本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...
总结一下,Hibernate的一对多关联映射通过注解方式定义了对象间的关联关系,使得我们在编程时能够以面向对象的方式操作数据,而底层数据库的操作则由Hibernate自动完成。这种方式大大提高了开发效率,同时也降低了...
在这个“基于注解的关联关系Hibernate”的主题中,我们将深入探讨如何使用Hibernate的注解来配置不同类型的关联关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-...
总之,这个“全注解方式实现的demo”展示了如何整合Struts2、Spring3和Hibernate,利用注解简化配置,提高开发效率。对于初学者,这是一个很好的学习资源,可以深入理解这三大框架的协同工作以及注解在实际项目中的...
在`Hibernate`中,我们还可以使用注解来处理关联关系,如`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`,它们分别对应一对一、一对多、多对一和多对多的关系。例如,一个用户可以有多个订单,那么在订单...
使用Hibernate的注解方式,我们可以更直观地在Java代码中定义实体类和它们之间的关系,减少了XML配置的工作量。理解并熟练掌握一对多和多对一的关系映射是Hibernate应用中的关键技能,这有助于构建高效、易于维护的...
这篇文章主要讲解了如何在Java开发中使用Hibernate4框架,通过注解的方式进行数据库操作。Hibernate4是Java领域中广泛应用的对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来处理数据库操作,极大地...
这篇博客"Hibernate学习一--注解方式自动建表"主要探讨了如何使用Hibernate的注解来实现数据库表的自动化创建。 在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中插入信息的方式,这些信息可以被...
本篇将详细探讨Hibernate的注解方式以及HQL(Hibernate Query Language)查询。 一、Hibernate注解方式 1. **实体类注解**:在Hibernate中,我们可以使用注解来定义一个Java类为数据库中的表。例如,使用`@Entity`...
总的来说,Spring MVC、Spring 4.x和Hibernate 4的注解方式注入大大简化了开发过程,提高了代码的可读性和可维护性。开发者可以通过注解轻松地定义和管理组件之间的关系,降低了项目的复杂度,提升了开发效率。在...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...
Hibernate通过注解的方式极大地简化了实体Bean的映射过程,使得开发者能够更专注于业务逻辑的编写。同时,Hibernate还提供了丰富的扩展注解和验证器,进一步增强了其灵活性和可定制性。通过学习并掌握这些注解和配置...
hibernate关联映射注解多对多单向关联、
综上所述,SSH2框架的全注解开发是一种高效、灵活的开发方式,它结合了Struts2的MVC处理、Spring的依赖管理和事务控制以及Hibernate的ORM和延迟加载机制,为Java Web应用提供了强大的支撑。通过学习和掌握这些知识点...
在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...
### Hibernate 全部注解详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,允许开发人员...此外,Hibernate 还提供了更多的高级特性,如关联映射、查询语言等,有兴趣的读者可以进一步学习和探索。
Hibernate 支持多种元数据定义方式,其中注解方式因其简洁易用而受到广泛欢迎。Hibernate 的注解支持主要通过 Java Persistence API (JPA) 实现。 - **环境设置**: - **需求**:使用 Hibernate 的注解编程方式,...
对于字段,`@Column`注解用于映射列,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`则处理关联关系。除此之外,`@Transactional`注解用于声明方法需要在事务中执行。 SSH组合中的全注解开发还有其他一些...
Hibernate注解是一种元数据方式,用于在Java类和属性上声明数据库映射信息,从而避免了XML配置文件的繁琐。注解提供了一种更加简洁、直观的方式来描述实体类和它们与数据库表之间的关系。 1. **@Entity**: 表示一个...