- 浏览: 409208 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (325)
- 神经网络 (1)
- javascript (11)
- 数据结构 (2)
- 计算机图形学 (11)
- 模式识别 (1)
- 前端开发 (14)
- 机器学习 (11)
- ios开发 (50)
- Python (9)
- HTML5 (4)
- 计算机视觉 (9)
- 数字图像处理 (7)
- 架构设计 (19)
- 数据库设计 (9)
- 算法设计 (59)
- Java (37)
- 其他 (3)
- 游戏开发 (5)
- c++ (17)
- Linux (3)
- TCP/IP (2)
- Flex (41)
- 健康 (6)
- AI (2)
- 工具 (1)
- 数据挖掘 (1)
- 性能优化 (6)
- 综合 (2)
- 网络通信 (12)
- Android (2)
- UML (3)
- 软件设计 (11)
- 编程经验 (7)
- J2EE (1)
- 多媒体技术 (3)
- 数学 (7)
- php (4)
- 设计 (1)
- CS (2)
- 计算机理论 (1)
- 信息安全 (1)
最新评论
-
ahead_zhan:
good good good
flex3控件_ModuleLoader -
lonerzf:
好样的。非常感谢楼主
OpenCV视频教程整理 -
lonerzf:
好样的。谢谢~
OpenCV视频教程整理 -
coding1688:
博主说的不错,我在实现瀑布流布局时也用的masonry插件,有 ...
Javascript 瀑布流式布局及其动态效果的实现 -
snowolf:
除非玩游戏,不然没啥win的事情,或者用win的银行客户端,通 ...
macbook安装操作系统的机理分析
Hibernate注解
文章分类:Web前端
@org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true)
类定义前添加;
作用:当只需更新某个表的部分字段时,其他字段不会更新。在性能优化方面有一定的帮助。
基本属性映射
通过 @Basic 可以声明属性的存取策略:
@Basic(fetch=FetchType.EAGER) 即时获取(默认的存取策略)
@Basic(fetch=FetchType.LAZY) 延迟获取
通过 @Temporal 定义映射到数据库的时间精度:
@Temporal(TemporalType=DATE) 日期
@Temporal(TemporalType=TIME) 时间
@Temporal(TemporalType=TIMESTAMP) 两者兼具
使用 @Lob 映射Blob或Clob类型:根据属性类型决定
java.sql.CLOB, Character[], char[], String 将映射为 Clob
java.sql.BLOB, Byte[], byte[], serializable 将映射为 Blob
利用Hibernate Annotations进行对象关联映射(一)
1. 简介
在使用Hibernate的时候,对于对象之间的关联,往往是比较复杂的,比如如何映射多对多关系,如何映射双向/单向的关系等等。
在JDK5.0出来之前,往往很头疼于映射一个Collection类型的属性,好像有n多的参数需要设置,inverse、mappedby等等又是什么意思呢?如何确定关联双方的维护关系?
当JDK5.0横空出世之后,它带来的Generic、Annotation等等新的特性,给Hibernate带来了巨大的活力。随着新版本Hibernate的发布,我们可以发现,使用Hibernate,使用JDK的新特性,给我们的开发工作带来了很大的便利。
现在,我可以自由地创建领域模型类图,而很少关心它的存储,因为,我只需要用很少的几个Annotation,一切似乎都在完美地运转,使用它的缺省设置,无需过多的定义,就能满足我的项目中绝大部分的要求。
是不是很吸引人?下面,我尝试将一对一、一对多、多对多、双向、单向等概念,一次性集中对照着讨论一下,然后以一些例子来进行具体的说明,希望那些和我一样,对hibernate有兴趣的、曾经头疼于它的那些Collection等映射方法的朋友们有些帮助。
下面这一章的内容有点晦涩,如果你看不下去了,可以看看后面举例的那一章,映射设置与SQL语句对照着看,可能更加容易理解。(女性朋友们不要骂我,我不是SuperMan J )
2. 关联类型及映射方法
2.1 一对一
两个实体之间是一对一的关系。我们可以想象一下,一对一关系,表明两个实体之间关系非常密切。两个实体,在数据库中会映射成两张表。所以这两张表之间必定需要建立关联。有两种方法可以实现一对一的关系映射。
1、 两张表使用同样的主键值:
@Entitypublic class Body { @Id public Long getId() { return id; } @OneToOne(cascade = CascadeType.ALL, usePKasFK=true) public Heart getHeart() { return heart; } ...}@Entitypublic class Heart { @Id(generate = GeneratorType.NONE) public Long getId() { ...}}以上例子表明两张表将使用同样的键值。但是这种方法在hibernate3beta2版本中仍然是有局限的。
2、 通过外键关联
也就是在拥有者一边,指定它的外键
@Entitypublic class Customer implements Serializable { @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="passport_fk") public Passport getPassport() { ... }@Entitypublic class Passport implements Serializable { @OneToOne(mappedBy = "passport") public Customer getOwner() { ...} 上边的例子就是一个使用外键的实例。使用JoinColumn声明来指定数据库中的外键。上边的例子同时也表明,这是一个双向的一对一关系。在这种双向的关系中,你必须让拥有者这一边,负责被拥有者的创建、删除、更新操作(cascade = CascadeType.ALL)。同时,你必须在被拥有者那边定义,说它的信息不需要自己维护,这是通过定义mappedBy属性来决定的。这个属性的值,就是它的拥有者对被拥有者关联的属性的值。如上边的例子,mappedBy的意思就是说:我的(Passport的)信息是由对方的(Customer的)passport属性来映射的。
2.1.1 更多的解释
1、 如果没有标识cascade属性的值,表明它们之间没有任何关联操作。你必须先将属性的值保存之后,才能将主体的值保存。
2、 双向一对一关联中,可以在任何一方设置mappedBy属性,也可以在任何一方都不设置mappedBy。如果没有任何一方设置mappedBy,就意味着在双方的数据库表中都会保留着对对方的关联外键(双向关联)。在双向一对一关联中,完全没有必要在双方的数据库表中都保留对对方的关联外键,形成数据库主键双向关联。所以最好能设置一下mappedBy属性。虽然数据库中没有双方关联,但是在实体层,你仍然可以从任意一方访问到另外一方。
3、 如果有一方设置了mappedBy属性,则在设置mappedBy一方,不会有对方的外键关联。
2.2 多对一
多对一的关系比较简单,一个实体到另外一个实体的应用,在数据库中就表现为多对一的关系。
@Entity()public class Flight implements Serializable { @ManyToOne( cascade = {CascadeType.CREATE, CascadeType.MERGE} ) @JoinColumn(name="COMP_ID") public Company getCompany() { return company; } ...}上述例子表明,这是一种多对一关系,外键是COMP_ID。这个外键的定义也是可选的,在生成数据库的时候,如果你没有定义这个外键的名称,那么默认的规则就是“属性名_属性对应的ID”,如上例,假设Company的主键名为ID,那么,如果你不指定JoinColumn,默认生成的外键名就是“company_id”,因为company是属性的名称,而id是Company的主键名称。
2.2.1 更多的解释
多对一,如果是双向的,就意味着另外一端是一对多,这种一对多的关系,在数据库里面建立外键的时候,必定是在多的那一端,创建一个外键,关联到一那一端。所以ManyToOne是没有mappedBy属性的。只有在双向一对多关联中,才能在多的那端定义mappedBy属性。
2.3 一对多
通常,一对多的关系,在实体里面的表现就是一个集合对象。由于JDK5可以使用范型,所以,除非你使用了范型,否则,必须在一对多的关系中指定目标实体的名称。
2.3.1 双向一对多
@Entitypublic class Troop { @OneToMany(mappedBy="troop") public Set<Soldier> getSoldiers() { ...}@Entitypublic class Soldier { @ManyToOne @JoinColumn(name="troop_fk") public Troop getTroop() { ...}上面就是一个双向的例子。在mappedBy这一端,你不能定义任何物理参数(即有关数据库主键、外键之类的定义)。其实,所谓mappedBy,意思就是在mappedBy这一端,数据库里面没有任何外键关联到对方的表。这种关联是在对方的表中建立的。
2.3.2 单向一对多
所谓单向一对多,也就是说在“一”这一端,能访问所有的“多”,但是在“多”这一端却不能访问“一”的信息。
实现这种单向一对多,也有两种方法,下面这种方法是不建议的:
@Entitypublic class Customer implements Serializable { @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinColumn(name="CUST_ID") public Set<Ticket> getTickets() { ...}@Entitypublic class Ticket implements Serializable { ... //no bidir}这种方法就是在对方的表中添加一个外键关联。
2.3.3 使用表关联建立单向一对多关系
在单向一对多关联中,下面的方法才是推荐使用的方法。
你可以在“一”和“多”之间建立一张关联表。
@Entity()public class Trainer { @OneToMany @AssociationTable( table=@Table(name="TrainedMonkeys"), joinColumns = { @JoinColumn( name="trainer_id") }, inverseJoinColumns = @JoinColumn( name="monkey_id") ) public Set<Monkey> getTrainedMonkeys() { ...}@Entitypublic class Monkey { ... //no bidir}你可以看到,在“一”这一端,你需要定义关联表的信息:关联表的名称,关联表的外键(指向“一”的外键),关联表的反向外键(指向“多”的外键)。
2.3.4 缺省的一对多映射
如果你指定一个集合对象为一对多关联,但是却没有任何物理数据库表方面的描述,那么默认的情况就是使用关联表的方式,也就是说Hibernate将会给你自己建立关联表。而且关联表的名称是“一”端表名称+下划线+“多”端的表名;关联表对“一”表的外键是“一”表的名称+下划线+“一”表的主键名称;关联表对“多”端的外键就是“一”表的属性名称+下划线+“多”端的主键名称。举个例子:
@Entity()public class Trainer { @OneToMany public Set<Tiger> getTrainedTigers() { ...}@Entitypublic class Tiger { ... //no bidir}上述例子中,建立的关联表名称为“Trainer_Tiger”,到Trainer的外键是“trainer_id”,到Tiger的外键是“trainedTigers_id”。
发表评论
-
多种加密算法实现(JAVA)
2013-10-24 09:18 1622有短句“Sun Yat-sen University is ... -
nginx上搭建HLS流媒体服务器
2013-07-28 13:31 1391转自:http://blog.csdn.net/ ... -
断点续传的原理
2013-05-07 19:53 832转自:http://www.ibm.com/develope ... -
《JAVA与模式》之调停者模式
2012-06-21 20:06 639参考:http://www.cnblo ... -
Java 线程池的原理与实现
2011-10-23 15:48 697参考: http://www.blogjava.ne ... -
Java中读取字节流并按指定编码转换成字符串的方法
2011-05-21 11:22 1453参考: http://www.blogjava.net/pen ... -
字节流编码获取原来这么复杂,但也很简单
2011-05-21 11:02 1504参考:http://www.cnblogs ... -
使用Java.util.zip下的zipOutStream和zipInStream对字节流进行压缩和解压缩
2011-05-21 10:08 1722参考:http://www.blogjava.net/ushe ... -
ActionScript与Java类型对应表
2011-05-21 09:46 1032当你使用AMF格式进行RemoteObject 调用时,肯定会 ... -
基于red5的在线视频录制实例和详细注释
2011-05-14 23:03 1579参考:http://www.ccvita.com/130.ht ... -
Java 中几种查找算法
2011-05-12 10:31 1467顺序查找说明:顺序查找适合于存储结构为顺序存储或链接存储的线性 ... -
Converting data from Java to ActionScript
2011-05-07 14:23 988On the client side, the ide ... -
java大整数相加及相乘
2011-05-04 18:34 1489import java.io.BufferedInputStr ... -
.org.hibernate.ObjectNotFoundException: No row with the given identifier exists
2011-04-20 18:09 1151说到底,就是外键关联引起的问题。 问题产生原因:有一个 ... -
java.util.ConcurrentModificationException
2011-04-19 10:07 576一般来说这个异常是容器类在遍历的时候被修改时抛出的。比 ... -
Spring+Hibernate+Flex,update、delete操作无法持久到数据库的解决办法
2011-04-17 21:42 1416这个解决办法就是才有事务机制了。。。 我是spring ... -
hibernate 注解 一对多 唯一索引
2011-04-17 02:00 2829今天被hibernate和mysql整了一下,切身感受到索引的 ... -
精通Hibernate——映射一对多关联关系
2011-04-17 01:38 1019在域模型(实体域)中,关联关系是类与类之间最普遍的关系。根据U ... -
junit实现opensessionInView保持session
2011-04-11 10:00 830参考:http://allenwei.iteye.com/bl ... -
Hibernate中cascade与inverse属性详解
2011-04-07 10:57 1053原文: 忘记存了..... ...
相关推荐
本文档将深入探讨Hibernate注解的使用,帮助开发者更好地理解和利用这些注解来实现对象关系映射(ORM)。 一、Hibernate注解基础 Hibernate注解是一种元数据方式,用于在Java类和属性上声明数据库映射信息,从而...
使用hibernate注解,必须要使用库hibernate-commons-annotations,hibernate-core,hibernate-jpa,ejb3-persistence,javassist等
本主题将深入探讨Hibernate注解的相关知识点。 1. **注解概述**: 注解(Annotations)是Java 5引入的一种元数据,它提供了在源代码中嵌入信息的方式,这些信息可以被编译器或者在运行时的Java虚拟机使用。在...
这个"springmvc+hibernate注解框架整合 demo"是一个示例项目,展示了如何通过注解方式将这两个框架无缝集成。 **Spring MVC 框架** Spring MVC 是 Spring 框架的一部分,它提供了处理HTTP请求、转发响应以及管理...
### Hibernate注解API知识点概述 #### 一、Hibernate注解简介 Hibernate 是一款非常流行的 Java 持久层框架,它极大地简化了数据库操作。在 Hibernate 中,可以通过使用注解来映射对象与数据库表之间的关系,从而...
在实际项目中,除了这三个核心的Hibernate注解库,可能还需要其他的依赖,例如: - **jta.jar**:Java Transaction API,用于支持分布式事务处理。 - **javax.persistence-api.jar**:JPA规范的API,包含了一些基础...
在本文中,我们将深入探讨Hibernate注解的几个核心方面:级联关系、增删改查操作、二级缓存、日志配置以及注解解析。 1. **级联关系**: Hibernate中的级联关系允许我们在一个实体的操作中自动处理与其关联的其他...
《Hibernate注解详解》 Hibernate 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作。在Hibernate中,注解是用于描述Java类及其属性如何映射到数据库表的重要工具。本文将全面解析Hibernate中的...
总的来说,Hibernate注解使得Java对象与数据库表之间的映射变得更加直观和简洁,极大地减少了代码量,提高了开发效率。通过熟练掌握这些注解,开发者可以更好地利用Hibernate框架进行数据库操作。
"Hibernate注解一对多,多对一"是两个常见的关系映射类型,适用于处理实体类之间的复杂关联。 一、一对多关系 在现实世界中,例如一个部门有多个员工,这就是一对多的关系。在Hibernate中,我们可以使用`@...
### Hibernate注解详解 #### 一、概述 Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用程序中实现数据库操作。它通过提供强大的映射工具和服务,简化了基于Java的应用程序开发人员对数据库的访问过程...
【hibernate注解详解】 Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库。在Hibernate中,注解是声明对象与数据库表之间映射关系的主要方式。以下是对描述中提到的...
本实例"spring-hibernate注解配置源码"旨在展示如何在不使用XML配置的情况下,通过注解的方式整合Struts2、Spring和Hibernate,创建一个完整的MVC(模型-视图-控制器)架构的应用。下面将详细介绍这个过程中的关键...
下面我们将详细讲解如何配置和使用Spring+Hibernate注解声明式事务: 1. **配置Spring**: - 首先,我们需要在Spring配置文件中启用事务管理器,通常是`HibernateTransactionManager`,并配置数据源。 - 然后,...
在Java的ORM框架Hibernate中,注解是一种强大的工具,它允许开发者无需XML配置就能实现对象关系映射。本文主要总结了Hibernate中常见的注解用法,涵盖了类级别和属性级别的注解,以及与主键和非主键相关的注解。 1....
《Hibernate注解详解》 在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而随着Java注解的普及,Hibernate也开始广泛采用注解方式来替代XML配置,使得代码更加简洁,...
然后,在实体类中使用Hibernate注解定义数据模型,如: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence...
### Hibernate注解配置详解 #### 一、概述 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。在使用Hibernate的过程中,开发者可以通过注解来实现对象与数据库表之间...
在 Hibernate 中,注解是一种简洁且强大的工具,用于替代传统的 XML 配置文件来描述对象模型和数据库之间的映射关系。这篇文档将深入探讨 Hibernate 注解的使用。 ### 第 1 章 创建一个注解项目 在开始使用 ...
### Hibernate注解编程实例 #### Hibernate注解简介 在Java领域中,Hibernate作为一个非常流行的ORM(Object Relational Mapping,对象关系映射)框架,极大地简化了数据库操作的复杂度。通过将Java对象与数据库表...