`

JPA学习(一)——基本注解

 
阅读更多

何为JPA

JPA(Java Persistence API)Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在HibernateTopLinkORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有HibernateTopLinkORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。

 

JPA包括以下3方面的技术:

ORM映射元数据

JPA支持XMLJDK 5.0注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

Java持久化API

用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者可以从繁琐的JDBCSQL代码中解脱出来。

查询语言

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

 

总体来说JPA提供了一个基于注解的比较统一的ORM解决方案。

而现有的ORM框架,诸如Hibernate3.2(及以上)、TopLink10.1.3以及OpenJpa都提供了JPA的实现。

 

首先,创建一个Maven工程,由于Hibernate3.2以上的版本都对JPA进行了实现,所以可以借由Hibernate来了解JPA

所需要配置的Jar包依赖只有一个,Maven会帮我们导入其所依赖的所有jar包:

 

<properties>
	<hibernate.version>3.5.6-Final</hibernate.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>${hibernate.version}</version>
	</dependency>
</dependencies>

 

导入的Jar包包括:

 

 

接下来是JPA的配置文件,JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的,所以在src/main/resource目录下新建名为META-INF的文件夹,并在其中新建persistence.xml,文件具体内容如下:

 

<?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
  <persistence-unit name="jpaDemo" transaction-type="RESOURCE_LOCAL">
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
         <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
         <property name="hibernate.connection.username" value="root"/>
         <property name="hibernate.connection.password" value=""/>
         <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;characterEncoding=UTF-8"/>
         <property name="hibernate.hbm2ddl.auto" value="update"/>
      </properties>
  </persistence-unit>
</persistence>

 

在保存好以上文件的同时不要忘了将对应数据库的jdbcjar包加到工程依赖中:

 

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.22</version>
	</dependency>

 

然后可以在数据库中准备一张名为User的表:

 

CREATE TABLE `user` (
	`ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`Name` VARCHAR(50) NULL DEFAULT NULL,
	`Age` INT(3) UNSIGNED NULL DEFAULT NULL,
	`Sex` CHAR(1) NULL DEFAULT 'M' COMMENT 'M for male and F for female',
	`Address` TEXT NULL,
	`Birth` DATE NULL DEFAULT NULL,
	`Income` DECIMAL(10,2) UNSIGNED NULL DEFAULT '0.00',
	PRIMARY KEY (`ID`)
)

 

其实体类信息如下:

 

@Entity
public class User implements Serializable {

	private static final long serialVersionUID = -4969930054771554775L;

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	@Column(name = "ID")
	private int id;

	@Column(name = "Name", length = 50)
	private String name;

	@Column(name = "Age")
	private int age;

	@Column(name = "Sex", length = 1)
	private char sex;

	@Column(name = "Address")
	private String address;

	@Column(name = "Birth")
	@Temporal(TemporalType.DATE)
	private Date birth;

	@Column(name = "Income")
	private BigDecimal income;

	// getter and setter methods
}

 

我们可以看到除了注解之外,这就是一个简单的pojo,那么实体类与表的关联就是依靠每个字段上的注解,下面对一些比较重要的注解进行下说明:

@Entity(name = "User"):指明这个类是一个Domian Object(实体类),name属性不指定,则类名即为表名,指定则无此限制。

@Id:此字段为表的主键。

@GeneratedValue(strategy = xxx):主键生成策略,有以下4种:

         GenerationType.IDENTITY:自增主键,oracle不支持。

         GenerationType. AUTO:默认选项,由JPA选择合适策略。

         GenerationType. TABLE:通过表产生主键,主要方便数据库移植。

         GenerationType. SEQUENCE:通过序列产生主键。

@Column(name = "ID"):将字段与指定列绑定。不必制定字段类型,JPA可以通过反射获取。可以为字符类型指定长度,以便可以自动生成DDL语句。

@Temporal(TemporalType.DATE):时间类型必须指明具体类型,包括DATETIMETIMESTAMP

 

是不是很简单,下面我们可以对已经配置好的实体类进行下简单的测试:

public class TestDAO {
	@PersistenceContext
	private EntityManager em;

	public User getUserById(int id) {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpaDemo");
		em = factory.createEntityManager();

		return em.find(User.class, id);
	}

	public static void main(String[] args) {
		TestDAO dao = new TestDAO();
		User user = dao.getUserById(1);
		System.out.println(user.getName());
	}
}

其中Persistence.createEntityManagerFactory("jpaDemo")方法参数为persistence.xmlpersistence-unit标签的name值。

 

Run以下,可能会报出一些关于slf4j包的错误,主要原因是我们没有引入slf4j-log4j12jar包,并且hernate本身关联的slf4j包版本过低,对pom.xml进行修改加入如下依赖:

 

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.1</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.2</version>
</dependency>

 

Run一次,成功:


 

  • 大小: 34.8 KB
  • 大小: 23.5 KB
分享到:
评论

相关推荐

    JPA学习笔记(二)——JPA 注解

    `@Basic` 注解表示一个基本类型的属性与数据库表的字段映射。默认情况下,所有属性都隐式地具有`@Basic`,`optional`属性默认为`true`,表示该属性可以为null。 6. **@Column** `@Column` 注解用于定义字段在...

    Spring Data JPA系列4——Spring声明式事务处理与多数据源支持.doc

    在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。Spring 框架提供了声明式事务处理机制,使得业务代码中进行事务控制操作起来非常简单。只需加个@Transactional 注解即可,大大简化...

    JPA学习笔记-EJB-02JPA属性注解

    本文将继续深入探讨JPA的核心概念之一——注解标记,特别是`@Table`和`@Column`这两个非常重要的注解。通过这些注解,我们可以定义实体类与数据库表之间的映射关系。 #### 二、`@Table` 注解详解 `@Table`注解被...

    spring boot整合JPA——demo

    本示例“spring boot整合JPA——demo”将演示如何在Spring Boot项目中配置和使用JPA。 首先,我们需要理解Spring Boot与JPA的关系。Spring Boot是基于Spring框架的快速开发工具,它通过自动化配置减少了常规设置...

    jpa的基本描述

    JPA不仅提供了一种简单的对象关系映射机制,还提供了一套完整的查询语言——JPQL(Java Persistence Query Language)。JPQL是一种类似于SQL的语言,但它是面向对象的,可以直接操作实体对象。 例如,以下是一个...

    jpa的学习---jpa demo工程

    **JPA(Java Persistence API)学习——JPA Demo工程** JPA是Java平台上的一个标准,用于处理对象关系映射(ORM),它提供了一种在Java应用中管理和持久化对象的方式,简化了数据库操作。本篇文章将围绕JPA的基础...

    Jpa注解编程_好不容易找到

    - **Hibernate Extensions**:虽然本文主要关注JPA标准注解,但值得一提的是,Hibernate还提供了许多扩展注解和支持特性,比如`@GenericGenerator`、`@DynamicInsert`、`@DynamicUpdate`等,这些都是Hibernate独有的...

    13_jpa多对多双向关联实体定义与注解

    本篇将详细讲解JPA中的一个关键概念——多对多双向关联,并通过实体定义与注解设置来深入理解这一特性。"13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与...

    黑马程序员 jpa详解视频教程配套源代码 笔记 jar包 很全的

    总结来说,这个资源包提供了一个全面的JPA学习路径,从理论到实践,涵盖了JPA的核心概念、操作数据库的方法以及实战中的注意事项。通过观看黑马程序员的视频教程,结合源码、笔记和jar包,你将能够深入理解和掌握...

    JPA底层

    4. **Query(查询)**:JPA提供了一种强大的查询语言——JPQL(Java Persistence Query Language),类似于SQL,但面向对象。此外,还可以使用 Criteria API 进行更复杂的查询。 **JPA的工作流程:** 1. **实体的...

    JPA Demo 简单的了解下jpa

    JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; List&lt;User&gt; users = em....

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...

    jpa经典文档呀

    8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解实现。 9. **懒加载和级联操作**:懒加载可以延迟加载关联的对象,直到真正需要时才...

    JPA-1 概述与HelloWorld

    **Hibernate——JPA实现** Hibernate是JPA的一个流行实现,它是一个开源的对象关系映射框架。Hibernate不仅提供了JPA规范的所有功能,还额外提供了一些扩展特性,如第二级缓存、查询语言(HQL)和 Criteria API等。 ...

    SpringBoot第 8 讲:SpringBoot+JPA

    此外,JPA还支持查询语言——JPQL(Java Persistence Query Language),它是面向对象的查询语言,类似于SQL。使用JPQL,我们可以编写动态查询,甚至执行复杂的聚合操作。例如,`SELECT u FROM User u WHERE u.email...

    15_传智播客JPA详解_JPA中的联合主键

    本教程将聚焦于JPA中的一个关键概念——联合主键(Composite Key),这是处理多字段主键的一种方式。 联合主键是指在数据库表中,由两个或多个字段共同构成的唯一标识,这些字段的组合必须是唯一的。在JPA中,我们...

    JPA.rar_JPA 封装DAO

    JPA的另一个重要特性是查询语言——JPQL(Java Persistence Query Language)。JPQL类似于SQL,但它是面向对象的,允许开发者以对象的方式编写查询语句,从而避免了直接操作SQL可能带来的问题,如SQL注入。 在实际...

Global site tag (gtag.js) - Google Analytics