JPA(Java Persistence API), 是EJB3.0的组成部分, 它显著简化了EJB持续性并提供了一个对象关系映射方法, 该方法使开发者可以采用声明方式定义如何通过一种标准的可移植方式将Java对象映射到关系数据库表.
Hibernate从3.2开始, 就开始兼容JPA, 可以通过注释的方式, 代替原有的xml映射方式.
引入Hibernate annotation后, 我们需要进行如下准备, 下载依赖的类库.
Hibernate core 3.2+
Hibernate annotation
JPA
【示例】
首先先来看一个使用Annotation后的实体配置:
Company.java
@Entity
@Table(name = "fin_company")
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "c_name", length = 50, nullable = false)
private String name;
@Column(columnDefinition = "text")
private String description;
@OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Employee> employees;
public Company() {
this.employees = new ArrayList<Employee>();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employee.java
@Entity
@Table(name = "fin_employee")
public class Employee {
private long id;
private String name;
private Company company;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
@Transient
public String getCompanyName() {
return this.company.getName();
}
}在上面的Java类中, 我们可以看到, 所有以@开头的标注都是JPA标注, JPA标注可以写在属性名前, 也可以写在属性的get方法前. 接下来逐一介绍这些基本标注的意思.
【注释说明】
@Entity
将普通的Java类指定为实体, 默认情况下, 所有Java类为非持续化类@Table
指定映射数据表名, 默认情况下以类名作为数据表名, 如非特殊指定, 可以省略该注释项
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
指定该实体的主键字段, 并且主键的增长方式有JAP选择最适合于基础数据库的主键生成器
@Column(name = "c_name", length = 50, nullable = false)
private String name;
name: 默认情况下, JPA会根据属性名生成数据表字段名, 使用name属性进行特殊指定
length: 字段长度
nullable: 字段是否允许为空@Column(columnDefinition = "text")
private String description;
columnDefinition: 设置为在针对列生成DDL时希望JPA使用的SQL片断.
此设置与数据库绑定, 即切换数据库的时候可能需要进行修改.
@OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Employee> employees;
@OneToMany: 声明一对多关联映射, 即一个公司对应多个雇员
mappedBy: 如果关联是单项的, 该数据表维护关系字段
如双向关联(当前情况), 在一方设置mappedBy属性, 对应多方关联一方的属性名称.
让我们来看下一方的设置:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
public Company getCompany() {
return company;
}
在多方Employee方, 关联的属性名为company, 所以在一方设置的mappedBy值为company
@JoinColumn: 定义外键的列名
默认情况下, 无需配置, JPA默认以属性名+"_id"方式自动生成该外键列.
如需特殊指定, 设置name属性
fetch: 取得当前对象的时候, 是否加载关联对象
LAZY: 延迟加载策略, 获取当前对象时, 不加载级联对象, 会在首次load或get级联对象的时候加载
EAGER: 迫切获取加载策略, 获取当前对象时, 立即加载级联对象
cascade: 操作层叠关联对象策略
ALL: 针对拥有实体执行的任何持续性操作均层叠到关联的目标
MERGE: 如果合并了拥有实体, 则将 merge 层叠到关联的目标
PERSIST: 如果持久保存拥有实体, 则将 persist 层叠到关联的目标
REFRESH: 如果刷新了拥有实体, 则 refresh 为关联的层叠目标
REMOVE: 如果删除了拥有实体,则还删除关联的目标
当前例子设置为remove, 即在删除company对象时, 会级联删除所关联的employee对象
如不进行remove设置, 在删除操作时, 系统会报外键约束异常
@Transient默认情况下, JPA 持续性提供程序假设实体的所有字段均为持久字段
即所有属性都会映射到数据表字段
如需在实体增加方法, 但又不想进行映射, 使用此注释
相关推荐
二、Hibernate注解基础 1. 实体类注解:`@Entity` `@Entity`注解用于标记一个Java类为数据库中的实体表,每个实例对应表中的一条记录。例如: ```java @Entity public class User { //... } ``` 2. 主键注解...
1. 自动化数据持久化:通过注解配置,对象的修改可以直接反映到数据库中,反之亦然。 2. 关联映射:通过注解处理一对多、一对一、多对多等复杂关系,简化数据库设计。 3. 动态查询:使用Criteria API或HQL构建动态...
### Hibernate Annotation 学习知识点详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 巨具,它极大地简化了 Java 应用程序与数据库...对于初学者而言,掌握这些基础注解是学习 Hibernate 的关键一步。
- `@Entity`、`@Id`、`@Column`等是标准的JPA注解,而`@Formula`、`@Cacheable`、`@Filter`等是Hibernate特有的,提供更丰富的功能,如计算属性、缓存策略和动态过滤。 5. **通过XML覆写元数据** 虽然注解是首选...
- `@Entity` 注解标识一个Java类为数据库中的表,它是所有Hibernate实体类的基础。 - 类名通常与表名对应,但可以通过`@Table(name = "table_name")`自定义表名。 2. **主键与@Id** - 每个实体类通常有一个主键...
总的来说,这三个jar包是Hibernate注解开发的基础,它们共同构建了一个强大的ORM环境,让开发者能够专注于业务逻辑,而不必过多地关心数据库层面的细节。在实际项目中,通过引入这些库,可以提高开发效率,同时保持...
为了更好地整合这三个框架,并利用注解(Annotation)简化配置,开发者通常需要引入一系列的JAR包来支持这些框架的运行。 #### 1. Struts2 - **struts2-core-2.1.6.jar**:这是Struts2的核心库,提供了框架的主要...
尤其是在ORM(对象关系映射)领域,Hibernate通过注解方式简化了传统XML配置,使得数据库操作更加直观易懂。本文将深入探讨Hibernate的注解使用及其背后的原理。 1. **注解基础** - 注解(Annotations)是Java提供...
使用注解配置的实体管理,可以方便地执行CRUD(创建、读取、更新、删除)操作。 在实际项目中,除了这三个核心的Hibernate注解库,可能还需要其他的依赖,例如: - **jta.jar**:Java Transaction API,用于支持...
1. **注解基础**:Hibernate注解是基于Java Persistence API (JPA) 的一部分,它提供了一种声明式的方式来描述对象如何与数据库交互。比如,`@Entity`用于标记一个Java类为实体,`@Table`指定实体对应的数据库表,`@...
标题“SpringIOC_SpringMVC_SpringAnnotation_JPA”涵盖了四个关键的Java开发框架和概念:Spring IOC(Inversion of Control,控制反转),Spring MVC(Model-View-Controller),Spring注解,以及JPA(Java ...
8. Annotation配置:除了XML配置外,Hibernate也支持使用注解来定义实体类和映射关系,使得代码更加简洁。 9. 第三方库依赖:Hibernate自身依赖于其他库,如JTA(Java Transaction API)用于处理事务,JPA规范库,...
`hibernate-annotations.jar`和`hibernate-commons-annotations.jar`这两个文件是关于注解驱动的配置。Hibernate注解提供了在Java实体类上直接标注的方式,用于描述实体与数据库表之间的映射关系,例如@Table、@...
- `persistence.xml`:Hibernate的JPA配置文件,用于定义实体管理和数据源。 - 各个注解过的Java类,如User、UserService、UserController等。 总之,这个“全注解方式实现的demo”展示了如何整合Struts2、Spring3...
7. **Annotation Processor**:如果你使用注解来配置实体类,那么可能需要Hibernate的注解处理器,它会在编译时进行验证和生成元数据。 8. **Optional Dependencies**:除了以上基础包,还有其他可选依赖,如...
接着,深入研究实体类的注解配置,掌握如何映射数据库表。之后,了解Session和Transaction管理,以及查询操作,包括HQL和Criteria API。最后,探究更高级的主题,如性能调优、二级缓存和多表关联。 **五、实践应用*...
在这个“hibernate+springMvc注解例子”中,我们将深入探讨如何结合使用这两个框架,特别是利用注解进行配置,以简化开发过程。 首先,Spring MVC是一个用于构建Web应用程序的MVC框架,它提供了模型、视图和控制器...
3. ** Annotation处理器**:`hibernate-jpa-2.1-api.jar` 提供了Java Persistence API(JPA)的注解支持,使得我们可以在实体类上直接使用注解来定义数据库映射。 4. **Entity Manager**:`hibernate-entitymanager...
此外,随着Java Persistence API(JPA)的普及,Hibernate也开始支持注解配置,这种方式更加简洁,减少了XML的使用。 总的来说,"hibernate5.0.7 jar"包含了实现ORM功能所需的所有组件,而"DTD"文件则提供了配置...