1.使用@注解配置实体类

实体类一般有ID、普通属性、集合属性等,分别对应数据库的主键、普通列、外键。@注解配置中,实体类用@Entity注解,用@Table指定对应的数据表,用@Id配置主键,用@Column配置普通属性,用@OneToMany、@ManyToOne、@OneToOne、@ManyToMany配置实体间关系等。实体类之间的关于在后面的章节中会做详细介绍。下面编写一个UsersVo类,在该类中使用@注解配置实体类的映射,UsersVo类的代码如下:

package com.cn.vo;
import javax.persistence.*;
@Entity // 注解Entity表示该类纳入Hibernate管理,能够被持久化
@Table(name = "users") // 指定该实体类对应的数据库表名
public class UsersVo {
// Fields
@Id // 指定该列为主键。
// 这个注解用来表示主键类型, auto为数据库自增长类型
@GeneratedValue(strategy = GenerationType.AUTO)
private int id; @Column(name = "name") //指定变量对应的数据库表的列为"name"
private String name; @Column(name = "age")//指定变量对应的数据库表的列为"age"
private int age; @Column(name = "tel")//指定变量对应的数据库表的列为"tel"
private String tel; @Column(name = "address")//指定变量对应的数据库表的列为"address"
private String address; }

2  使用XML文件配置实体类映射

多个实体类可以配置在一个XML文件中。Hibernate推荐XML映射文件和实体类同名,便于阅读和维护,比如UsersVo.java文件对应UsersVo. hbm.xml文件。XML文件一般以“.hbm.xml”结尾,便于辨认,也可以直接用“.xml”结尾。例如UsersVo类的映射文件可取名为“UsersVo.hbm.xml”或者“UsersVo.xml”。使用XML文件配置实体类映射的时候,实体类和普通的实体类一样,和数据库的映射关系放在XML文件中,UsersVo. hbm.xml文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<!-- name=””用来指定实体类, table="”用来指定数据库表格 catalog表示连接的数据库 lazy表示延迟加载 -->
<class name="com.cn.vo.UsersVo" table="users" catalog="bank" lazy="false">
<id name="id" type="java.lang.Integer"><!-- 配置实体类变量-->
<column name="id" /><!-- 主键的字段名 -->
<generator class="assigned" /><!-- 主键 类型,这里设置成不主动增长 -->
</id>
<property name="name" type="java.lang.String"><!-- 配置实体类变量-->
<column name="name" length="20" /><!-- 数据库的字段名和字段长度 -->
</class>
</hibernate-mapping>

代码中的DOCTYPE指定的dtd文件位于hibernate.jar中。dtd文件为XML格式验证文件,Hibernate使用该dtd来验证该XML文件格式是否正确。如果hibernate.jar或者classpath中不存在该dtd文件,Hibernate会到指定的URL下载该文件。

在上述的映射文件中,<class>中的name表示实体类的路径和名称。table="”用来指定数据库表格 catalog表示连接的数据库 lazy表示延迟加载,<id>用来声明表的主键,<id>中的属性name="id"表示实体类的属性id。数据库对应的字段名放在<column>中,<column>中的name表示表中的字段名,<generator class="assigned" />表示数据库表的主键类型为默认的类型,默认的类型是不自动增长类型,在<property>中映射表中的其他字段,<property>中的name属性值表示实体类的属性,type表示实体类属性的类型。表字段的映射放在<column>中,name的值是字段名,length表示字段长度。

3  在hibernate.cfg.xml文件中配置实体类映射

实体类还需要配置到hibernate.cfg.xml中,以便Hibernate初始化实体类与数据库表的映射关系。如果只配置了映射关系,而没有配置到hibernate.cfg.xml中,Hibernate是无法解析实体类的,因为Hibernate无法自行判断哪些是实体类。

如果实体类是使用@注解配置的,需要用<mapping class=””/>配置,而如果是用XML文件配置的,需要用<mapping resource=””/>配置XML配置文件。hibernate.cfg.xml文件中配置实体类映射的示例代码如下:

<!-- 使用XML映射文件映射实体类的配置 -->
<mapping resource="com/cn/vo/UsersVo.hbm.xml"/>
<mapping resource="com/cn/vo/DeptVo.hbm.xml"/> <!-- 使用@注解映射实体类的配置 -->
<mapping class="com.cn.vo.UsersVo "/>
<mapping class="com.cn.vo.DeptVo "/> 

4  配置主键映射

实体类最好有主键列,并有对应的getter、setter方法,这是Hibernate推荐的。主键尽量使用可以为null值的类型,例如Integer、Long、String等,而不要使用int、long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而int、long等原始类型则不具备该功能。

1.  使用@注解配置主键

Hibernate中用@Id声明该列为主键列,同时用@Column声明该列的列名。当列名与属性名相同时,@Column配置可省略。@GeneratedValue用于指定主键的生成策略。Hibernate支持多种逐渐生成规则,例如自增长、由某个表决定、由Sequence决定等等。如果不配置@GeneratedValue,则必须手动设置ID值。

@Id

@Column(name = "id")

// 设置主键类型, auto表示主键是自增长类型

@GeneratedValue(strategy = GenerationType.AUTO)

private Integer id;

2.  XML文件中配置主键

如果使用XML配置,主键用<id />配置,name指定实体类的主键属性,column指定数据表中的主键列名。使用嵌套的<generator />配置主键生成策略,native表示使用数据库自己的策略,在MySQL中就是自增长类型,如果不用自动增长类型,则可以用assigned,例如:

<id name="id" column="id">

<generator class="native" />

</id>

5.  使用@注解配置普通属性映射

这里说的普通属性,是指除了主键外的、Java基本类型的属性,Integer类型与int类型是不同的,Integer默认为null,在数据库中也表现为null,而int默认为0,在数据库中也表现为0。

普通属性使用@Column与@Basic配置。二者都可以省略。如果省略,则全部按照默认的规则配置,@Column与@Basic的用法如下:

q @Column中可指定nullable(是否允许为null)、unique(是否唯一)、insertable(是否允许插入)、updatable(是否允许更新)、length(列长度)、columnDefinition(列类型)、scale(整数长度)、precision(小数点精度)等。这些属性用于生成DDL建表语句。如果属性对应的列名与属性名一致,@Column可以省略。

q @Basic可为普通属性配置加载方式,默认为即时加载。如果列数据比较大,例如大文本类型或者LOB类型,可配置为延迟加载。optional配置该列是否可为null。如果为true,表示该属性是可选的,可以为null,否则不可以为null。

@Column与@Basic使用的代码示例如下:

@Column(name = "usersName", nullable = true, columnDefinition = "varchar", insertable = true, length = 255, unique = true, updatable = true, precision = 2, scale = 4)

@Basic(fetch = FetchType.LAZY, optional=true)

private String usersName;

日期属性也是普通的属性,需要用@Basic声明加载方式、@Column等指定列名,二者都可省略。另外,如果日期属性是java.util.Date类型的,必须要用@Temporal配置日期类型,取值可以为Date、Time或者Timestemp。否则Hibernate将无法区分该类型是到底是java.sql.Date(只有年月日等日期信息)类型还是java.sql.Time(只有时分秒等时间信息)类型、还是java.sql.TimeStamp(既有日期信息、又有时间信息)类型。例如:

@Temporal(TemporalType.TIMESTAMP) // 日期类型为DATE, TIME或者TIMESTEMP。

@Column(name = " birthday")

private java.util.Date birthday;

在配置日期属性时,如果属性类型是java.util.Date类型,需要用@Temporal声明日期类型。但是如果是java.sql.Time、java.sql.Date或者java.sql.TimeStamp类型的,类型本身就已经很明确了,不再需要@Temporal声明了。

Hibernate映射之实体映射的更多相关文章

  1. Hibernate映射之实体映射<转载>

    实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的.Hibernate支持xml配置文件与@注解配置两种方式.xm ...

  2. Hibernate处理一个实体映射多张相同结构的数据表--动态映射

    [转自] http://blog.csdn.net/majian_1987/article/details/8725197 LZ在项目中需要处理这样一个业务,每天都有终端设备上传GPS位置信息到服务端 ...

  3. Hibernate之jpa实体映射的三种继承关系

    在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略. 1.单表继承 ...

  4. Hibernate中的实体映射

     一.一对一映射  如人(Person)与身份证(IdCard) 的关系,即为一对一的关系,一个人只能有一张身份证,一张身份证只能属于某一个人,它们的关系图如下图所示: 在Person实体中添加一个属 ...

  5. hibernate加载实体映射文件 及映射文件auto-import

    第一种方法: 在hibernate.cfg.xml中<mapping resource="包名/Xxx.hbm.xml"/>包名为路径形式( x/x/x这种形式) 第二 ...

  6. Hibernate(三)结构-配置文件-实体映射及配置文件

    一.体系结构 SessionFactory:属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照.Session的工厂.有可能持有一个可选的数据缓存可以进程级别或者群级别保存可以在事务中 ...

  7. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  8. Hibernate 随记(数据库映射流程)

      ORM:Object/Relationship Mapping  对象/关系映射   实现流程:   1.项目中导入Hibernate相关类包并创建配置文件.Hibernate.cfg.xml(可 ...

  9. Hibernate持久化类属性映射

    Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...

随机推荐

  1. EntityFramework 开始小试

    1 Install-Package EntityFramework 2 创建实体类 public class Blog { public int BlogId { get; set; } public ...

  2. NPOI利用多任务模式分批写入多个Excel

    接上文NPOI大数据分批写入同个Excel,这次是利用task多任务同时写入到多个Excel. Form2.cs private void btnExport_Click(object sender, ...

  3. 《Linux内核设计的艺术》学习笔记(五)INT 0x10中断

    参考书籍: 1. <IBM-PC汇编语言程序设计> 2. http://www.ctyme.com/intr/int-10.htm   ◆ 设置显示方式: 功能号:AH = 00H 调用参 ...

  4. C#线程系列讲座(5):同步技术之Monitor

    在上一讲介绍了使用lock来实现线程之间的同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public sta ...

  5. iOS - Swift 数据持久化

    1.Sandbox 沙箱 iOS 为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的文件目录,不可以访问其他目录,每个应用自己独立的访问空间被称为该应用的沙盒.也就是说,一个应用与文件 ...

  6. compile,build和execute的区别

    一个c程序的生成要经历以下步骤: 1.编写文本代码,生成c或cpp文件,这时候它还是文本的: 2.编译,就是compile,由c编译程序对你写的代码进行词法和句法分析,发现并报告错误,有错时编译不能通 ...

  7. Nginx模块学习之————accesskey权限模块使用(简单的m3u8防盗链)

    配置文件:http://www.cnblogs.com/tinywan/p/5983694.html 通过加密后的文件: 正确地址:curl -i http://访问的IP地址(这里是直播节点IP地址 ...

  8. [转载] 使用异步 I/O 大大提高应用程序的性能

    原文: http://www.ibm.com/developerworks/cn/linux/l-async/ Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出 ...

  9. matplotlib库的常用知识

    看看matplotlib是什么? matplotlib是python上的一个2D绘图库,它可以在夸平台上边出很多高质量的图像.综旨就是让简单的事变得更简单,让复杂的事变得可能.我们可以用matplot ...

  10. (三)结构体指针、sizeof

    (一)结构体指针定义 今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了.我先贴出来第一次写的代码以及gcc编译器下报的错误: #include&l ...