`
sunbin
  • 浏览: 354468 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate中@Entity和@Table的区别

 
阅读更多

Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。
这些普通Java对象被称作Entity Bean。
除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。
事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。

Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。



 hibernate中@Entity和@Table的区别:
@Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名
如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则,@Column来改变class中字段名与db中表的字段名的映射规则

 

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

http://blog.csdn.net/lyq123333321/article/details/44217409

 

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

如果没有 @javax.persistence.Entity 和 @javax.persistence.Id 这两个注解的话,它完全就是一个典型的 POJO 的 Java 类,现在加上这两个注解之后,就可以作为一个实体类与数据库中的表相对应。他在数据库中的对应的表为:

图 1. Employee 表对应的 ER 图

  

映射规则:

1. 实体类必须用 @javax.persistence.Entity 进行注解;

2. 必须使用 @javax.persistence.Id 来注解一个主键;

3. 实体类必须拥有一个 public 或者 protected无参构造函数,之外实体类还可以拥有其他的构造函数;

4. 实体类必须是一个顶级类(top-level class)。一个枚举(enum)或者一个接口(interface)不能被注解为一个实体;

5. 实体不能是 final 类型的,也不能有 final 类型的方法;

6. 如果实体类的一个实例需要用传值的方式调用(例如,远程调用),则这个实体类必须实现(implements)java.io.Serializable 接口。

将一个 POJO 的 Java 类映射成数据库中的表如此简单,这主要得益于 Java EE 5种引入的  Configuration by Exception 的理念,这个理念的核心就是容器或者供应商提供一个缺省的规则,在这个规则下程序是可以正确运行的,如果开发人员有特殊的需求,需要改变这个默认的规则,那么就是对默认规则来说就是一个异常(Exception)。

如上例所示:默认的映射规则就是数据库表的名字和对应的 Java 类的名字相同,表中列的名字和 Java 类中相对应的字段的名字相同。

现在我们可以改变这种默认的规则:

清单 2. 使用 @Table 和 @Column 注解修改映射规则

 

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

首先我们可以可以使用

@Javax.persistence.Table 这个注解来改变 Java 类在数据库表种对应的表名。这个注解的定义如下:

@javax.persistence.Column 注解,定义了列的属性,你可以用这个注解改变数据库中表的列名(缺省情况下表对应的列名和类的字段名同名);指定列的长度;或者指定某列是否可以为空,或者是否唯一,或者能否更新或插入。

从它的定义可以看出他只可以用在类中的方法前面或者字段前面。

其中 name 属性的值为数据库中的列名,unique 属性说明该烈是否唯一,nullable 属性说明是否可以为空,length 属性指明了该列的最大长度等等。其中 table 属性将在 @SecondaryTable 的使用中已有过介绍。

JPA 中两种注解方式

JPA 中将一个类注解成实体类(entity class)有两种不同的注解方式:基于属性(property-based)和基于字段(field-based)的注解。

1,基于字段的注解,就是直接将注解放置在实体类的字段的前面。前面的 Employee 实体类就是使用的这种注解方式;

2,基于属性的注解,就是直接将注解放置在实体类相应的 getter 方法前面,而不是 setter 方法前面(这一点和 Spring 正好相反)。前面的 Employee 实体类如果使用基于属性注解的方式就可以写成如下形式。

但是同一个实体类中必须并且只能使用其中一种注解方式,要么是基于属性的注解,要么是基于字段的注解。两种不同的注解方式,在数据库中对应的数据库表是相同的,没有任何区别,开发人员可以根据自己的喜好任意选用其中一种注解方式。

@SecondaryTable 的使用

上面介绍的几个例子都是一个实体类映射到数据库中的一个表中,那么能否将一个实体类映射到数据库两张或更多表中呢表中呢。在有些情况下如数据库中已经存在原始数据类型,并且要求不能更改,这个时候如果能实现一个实体类对应两张或多张表的话,将是很方便的。JPA2.0 中提供了一个 @SecondaryTablez 注解(annotation)就可以实现这种情况。下面用一个例子说明一下这个注解的使用方法:

清单 6. @SecondaryTable 的使用
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

 

清单 5 中定义了两个 Secondary 表,分别为 Address 和 Comments,
同时在 Forum 实体类中也通过 @Column 注解将某些子段分别分配给了这两张表,那些 table 属性得值是 Adress 的就会存在于 Address 表中,
同理 table 属性的值是 Comments 的就会存在于 Comments 表中。那些没有用 @Column 注解改变属性默认的字段将会存在于 Forum 表中。

图 4 就是持久化后在数据库中对应的表的 ER 图,从图中可看出来,这些字段如我们预料的一样被映射到了不同的表中。

图 4. @SecondaryTable 持久化后对赢得 ER 图

嵌套映射

在使用嵌套映射的时候首先要有一个被嵌套的类,清单 5 中 Address 实体类使用 @Embeddable 注解,说明这个就是一个可被嵌套的类,与 @EmbeddedId 复合主键策略中的主键类(primary key class)稍有不同的是,这个被嵌套类不用重写 hashCode() 和 equals() 方法,复合主键将在后面进行介绍。

清单 7. 被嵌套类
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

清单 6 中 Employee 实体类是嵌套类的拥有者,其中使用了 @Embedded 注解将 Address 类嵌套进来了。

 

清单 8. 嵌套类的使用者

 

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

清单 7 是持久化后生成的数据库表,可以看出被嵌套类的属性,也被持久化到了数据库中,默认的表名就是嵌套类的拥有者的类名。

清单 9. 使用嵌套类生成的表结构
 
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

被嵌套类的注解方式,field 方式或者 property 方式,依赖于嵌套类的拥有者。上面例子中的 Employee 实体类采用的是 field 注解方式,那么在持久化的过程中,被嵌套类 Address 也是按照 field 注解方式就行映射的。

我们也可以通过 @Access 注解改变被嵌套类映射方式,清单 8 通过使用 @Access 注解将 Address 被嵌套类的注解方式设定成了 property 方式。清单 9 Employee 仍然采用 filed 注解方式。这种情况下,持久化的时候,被嵌套类就会按照自己设定的注解方式映射,而不会再依赖于嵌套类的拥有者的注解方式。但这并不会映射的结果。

清单 10. 基于 property 方式注解的被嵌套类

 

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
清单 11. 基于 field 方式注解
 
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

事先设定被嵌套类的注解方式,是一种应该大力提倡的做法,因为当同一个类被不同的注解方式的类嵌套时,可能会出现一些错误。

 

总结

简单映射是 ORM,也就是对象关系映射中较为简单的一种,他只是数据库表与类之间的一一对应,并未涉及表之间的关系,也就未涉及类与类之间的关系,也可以说是其他如继承映射,关联关系映射的基础,所以说熟悉并掌握简单关系映射还是很有必要的。

  • JSR 3170:JavaTM Persistence API,Version 2.0。 JPA 全称 Java Persistence API,JPA 由 EJB 3.0 软件专家组开发,作为 JSR-220 实现的一部分。但它不囿于 EJB 3.0,你可以在 Web 应用、甚至桌面应用中使用。JPA 的宗旨是为 POJO 提供持久化标准规范。
  • Hibernate:Java 对象持久化技术详解: Hibernate 是一个开放源代码的 ORM(对象关系映射)框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
  • developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。

讨论

  • 加入 developerWorks 中文社区:查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

http://www.ibm.com/developerworks/cn/java/j-lo-jpasimpemap/

分享到:
评论

相关推荐

    hibernate annotations

    在Hibernate中,注解用来描述对象如何映射到数据库表,如@Entity、@Table等。 2. **实体(Entities)**:在Hibernate中,一个实体代表数据库中的一个记录。通过使用@Entity注解,我们可以声明一个Java类为实体。...

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

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。本文将详细解析Hibernate中的注解使用,帮助理解如何通过注解简化数据库操作。 首先,实体Bean是...

    hibernate-annotation-3.4.0.GA

    在3.4.0.GA版本中,Hibernate引入了注解支持,使得开发人员能够更方便地在类和属性上直接标注,无需依赖XML配置文件,提高了开发效率。本文将详细探讨Hibernate注解3.4.0.GA版本中的关键概念和用法。 一、实体注解@...

    Hibernate 注解大全

    通过阅读《Hibernate注释.doc》和《Hibernate注释大全.txt》这两个文档,你可以获得更详细的信息,深入理解Hibernate注解的使用场景和配置细节。同时,参考提供的博文链接...

    hibernate Table per class hierarchy 例子代码

    在Java的持久化框架Hibernate中,"Table per Class Hierarchy"是一种继承映射策略,它在数据库层面将类继承关系转换为单一表的结构。这种策略适用于子类相对较少,且共享很多公共属性的情况,因为它避免了为每个子类...

    mis.rar_MyBeanUtils _hibernate @Finder_mis_springmvc_springmvc h

    - 创建实体类,并使用Hibernate的注解(如@Entity、@Table等)进行对象-关系映射。 - 如果@Finder注解存在,那么需要定义查询方法并标注,以便于动态生成SQL。 - 在SpringMVC的Controller中,通过依赖注入获取...

    Hibernate 3 注解技术讲解

    在Hibernate 3之前,实体类和它们与数据库表之间的映射通常通过XML配置文件(如hibernate.cfg.xml和.hbm.xml)来定义。然而,随着注解的引入,这些信息可以直接在Java类上声明,使得代码更加简洁、易读。 ### 2. ...

    Hibernate注解配置表映射实例

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据...通过学习和实践这些注解,你可以更好地理解和掌握Hibernate在实际项目中的应用。

    hibernate中的注释学习,以及注释帮助

    1. `@Inheritance` 和 `@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`: 表示单表继承,所有子类的数据都存储在同一个数据库表中。 2. `@DiscriminatorColumn`: 定义一个字段来区分不同的子类。 3. `@...

    hibernate实体系注解

    本教程将深入探讨如何在Hibernate中使用注解来实现实体类的配置,特别是关注一对多和多对一的关系映射。 **一、Hibernate注解基础** 在Hibernate 3.2之后,引入了注解支持,使得开发者不再需要XML配置文件来定义...

    hibernate-annotation

    而Hibernate注解则是其在ORM(对象关系映射)领域的进一步进化,它允许开发者将元数据直接嵌入到Java类和属性的声明中,从而避免了XML配置文件的繁琐。本篇将详细阐述Hibernate注解的相关知识。 一、Hibernate注解...

    java entity

    在Java编程领域,"Entity"通常指的是业务对象或者数据库中的表对应的类,是Java持久化技术的核心概念之一。本文将深入探讨Java实体(Entity)在Java注解(Annotation)环境下的应用,以及如何通过注解实现实体关系...

    Hibernate标签

    Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,而无需关心底层SQL语句的编写。在Hibernate中,标签(Annotations)是用于...

    hibernate关于实体的注解(中英文)

    在Hibernate中,实体是与数据库表相对应的Java类,而注解则是用来标记这些实体类及其属性,以便于Hibernate理解和管理它们。本篇文章将深入探讨Hibernate中的实体注解,包括其中英文含义,并提供一些实用的例子。 1...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多...

    hibernate注解详解

    本文将深入探讨Hibernate中的注解,帮助你更好地理解和应用它们。 1. **实体注解(@Entity)** `@Entity` 注解用于标记一个Java类为Hibernate的实体类,它对应数据库中的一个表。例如: ```java @Entity public ...

    Hibernate3.2 Annotations中文文档

    在Hibernate 3.2版本中,引入了Annotations特性,这是一种更加简洁、直观的方式来描述对象与数据库表之间的映射关系,取代了之前的XML配置文件。这个文档提供了详细的中文指南,帮助开发者理解和应用Hibernate 3.2的...

    hibernate 注解的一些资料

    在 Hibernate 中,每个 Java 类都可以被标记为实体类,这通常通过在类上使用 `@Entity` 注解来实现。例如: ```java @Entity public class User { // ... } ``` 这表明 `User` 类将映射到数据库中的一个表。 ### ...

    Hibernate中文文档+hibernate annotation +distribution

    例如,`@Entity`表示一个类作为数据库中的表,`@Table`定义具体的表名,`@Id`标识主键,`@GeneratedValue`处理主键生成策略等。这些注解大大减少了XML配置的工作量,使得代码更易读、更直观。 再者,hibernate-...

    hibernate各种常用关联关系的基本配置

    在Java的持久化框架Hibernate中,对象关系映射(ORM)是其核心功能之一,它允许开发者用面向对象的方式处理数据库操作。关联关系是ORM中关键的概念,它模拟了现实世界中的实体之间的联系。本篇文章将深入探讨...

Global site tag (gtag.js) - Google Analytics