`

HIbernate注解

阅读更多

 

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”。


分享到:
评论

相关推荐

    Hibernate 注解说明文档

    本文档将深入探讨Hibernate注解的使用,帮助开发者更好地理解和利用这些注解来实现对象关系映射(ORM)。 一、Hibernate注解基础 Hibernate注解是一种元数据方式,用于在Java类和属性上声明数据库映射信息,从而...

    hibernate注解所需包

    使用hibernate注解,必须要使用库hibernate-commons-annotations,hibernate-core,hibernate-jpa,ejb3-persistence,javassist等

    Hibernate注解jar包

    本主题将深入探讨Hibernate注解的相关知识点。 1. **注解概述**: 注解(Annotations)是Java 5引入的一种元数据,它提供了在源代码中嵌入信息的方式,这些信息可以被编译器或者在运行时的Java虚拟机使用。在...

    springmvc+hibernate注解框架整合 demo

    这个"springmvc+hibernate注解框架整合 demo"是一个示例项目,展示了如何通过注解方式将这两个框架无缝集成。 **Spring MVC 框架** Spring MVC 是 Spring 框架的一部分,它提供了处理HTTP请求、转发响应以及管理...

    Hibernate注解API.pdf

    ### Hibernate注解API知识点概述 #### 一、Hibernate注解简介 Hibernate 是一款非常流行的 Java 持久层框架,它极大地简化了数据库操作。在 Hibernate 中,可以通过使用注解来映射对象与数据库表之间的关系,从而...

    hibernate注解所需jar包

    在实际项目中,除了这三个核心的Hibernate注解库,可能还需要其他的依赖,例如: - **jta.jar**:Java Transaction API,用于支持分布式事务处理。 - **javax.persistence-api.jar**:JPA规范的API,包含了一些基础...

    hibernate注解

    在本文中,我们将深入探讨Hibernate注解的几个核心方面:级联关系、增删改查操作、二级缓存、日志配置以及注解解析。 1. **级联关系**: Hibernate中的级联关系允许我们在一个实体的操作中自动处理与其关联的其他...

    Hibernate注解、注释大全

    《Hibernate注解详解》 Hibernate 是一款强大的Java对象关系映射(ORM)框架,它极大地简化了数据库操作。在Hibernate中,注解是用于描述Java类及其属性如何映射到数据库表的重要工具。本文将全面解析Hibernate中的...

    Hibernate注解详解(超全面不解释).pdf

    总的来说,Hibernate注解使得Java对象与数据库表之间的映射变得更加直观和简洁,极大地减少了代码量,提高了开发效率。通过熟练掌握这些注解,开发者可以更好地利用Hibernate框架进行数据库操作。

    Hibernate 注解一对多,多对一

    "Hibernate注解一对多,多对一"是两个常见的关系映射类型,适用于处理实体类之间的复杂关联。 一、一对多关系 在现实世界中,例如一个部门有多个员工,这就是一对多的关系。在Hibernate中,我们可以使用`@...

    Hibernate注解大全

    ### Hibernate注解详解 #### 一、概述 Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用程序中实现数据库操作。它通过提供强大的映射工具和服务,简化了基于Java的应用程序开发人员对数据库的访问过程...

    hibernate注解大全

    【hibernate注解详解】 Hibernate 是一个流行的Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库。在Hibernate中,注解是声明对象与数据库表之间映射关系的主要方式。以下是对描述中提到的...

    spring-hibernate注解配置源码

    本实例"spring-hibernate注解配置源码"旨在展示如何在不使用XML配置的情况下,通过注解的方式整合Struts2、Spring和Hibernate,创建一个完整的MVC(模型-视图-控制器)架构的应用。下面将详细介绍这个过程中的关键...

    Spring+Hibernate注解事务实例

    下面我们将详细讲解如何配置和使用Spring+Hibernate注解声明式事务: 1. **配置Spring**: - 首先,我们需要在Spring配置文件中启用事务管理器,通常是`HibernateTransactionManager`,并配置数据源。 - 然后,...

    Hibernate注解用法总结

    在Java的ORM框架Hibernate中,注解是一种强大的工具,它允许开发者无需XML配置就能实现对象关系映射。本文主要总结了Hibernate中常见的注解用法,涵盖了类级别和属性级别的注解,以及与主键和非主键相关的注解。 1....

    hibernate注解.rar

    《Hibernate注解详解》 在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而随着Java注解的普及,Hibernate也开始广泛采用注解方式来替代XML配置,使得代码更加简洁,...

    maven hibernate 注解

    然后,在实体类中使用Hibernate注解定义数据模型,如: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence...

    hibernate注解配置

    ### Hibernate注解配置详解 #### 一、概述 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程。在使用Hibernate的过程中,开发者可以通过注解来实现对象与数据库表之间...

    hibernate注解详解说明

    在 Hibernate 中,注解是一种简洁且强大的工具,用于替代传统的 XML 配置文件来描述对象模型和数据库之间的映射关系。这篇文档将深入探讨 Hibernate 注解的使用。 ### 第 1 章 创建一个注解项目 在开始使用 ...

    Hibernate注解编程实例

    ### Hibernate注解编程实例 #### Hibernate注解简介 在Java领域中,Hibernate作为一个非常流行的ORM(Object Relational Mapping,对象关系映射)框架,极大地简化了数据库操作的复杂度。通过将Java对象与数据库表...

Global site tag (gtag.js) - Google Analytics