//构造方法、Getter/Setter方法略
}
@Entity注解表明User是一个JPA实体。每一个User对象有一个唯一的主键标识符id,它是Spring Data JPA自动自增生成的,无需手动处理它。上述领域对象定义了数据存储的格式,Spring Data JPA将其字段映射到关系型数据库表中的列名,假设现在有一个User对象:
User user = new User(1L, "test@test.com", "Test Name");
它在关系型数据库(这里我们用到的是类路径上默认的内存数据库H2Database)中的存储结构是:
id email name
1 test@test.com Test Name
Repository
有了领域对象User后,需要定义一个能对其进行增删改查操作的Repository接口:
findOne(Long id)
findAll()
save(User user)
在应用启动时,Spring会自动创建这个接口的实现。以调用findOne(1L)为例,实际上Spring Data JPA帮我们生成了一个这样的sql查询:
select * from users where id = 1;
并且将查询结果集按字段名映射为一个User对象并返回。这也就是ORM(Object Relation Mapper)框架帮助我们简化数据访问层开发的基本方法于思路。
同时Spring Data Rest也会在Spring MVC中绑定响应的HTTP路由方法,并创建User对象的RESTful访问端点/users:
GET /users User列表信息(数据来源于UserRepository对应的关系型数据库,下同)
POST /users 创建一个User对象
GET /users/{id} 获取单个User对象
PUT /users/{id} 更新单个User对象
DELETE /users/{id} 删除单个User对象
这也就是对于User资源最基本的增删改查以及列表的RESTful访问接口,在使用Spring Data Rest项目后,我们不再需要自己动手编写这些@Controller,对于大部分资源来说,这些代码都是大同小异的,Spring Data Rest正是把这些通用的代码抽取出来,减轻了我们的编码工作量。
id email name addressId
1 test@test.com Test Name 1
addressId字段表示关联表Address中id为1的记录,SQL查询语句可以这样写:
select u.id as userId, email, name, a.id as addressId, city, street
from address a inner join user u on a.id = u.addressId where u.id = 1
Spring Data JPA基于ORM映射原理,可以这样定义关联关系:
@Override
public void run(String... args) throws Exception {
User user = new User("hello@world.com", "Hello World");
user.setAddress(new Address("Beijing", "Yiheyuan Road 5"));
userRepository.save(user);
}
也就是说Spring Data JPA会自动的将User对象中嵌套的组合对象Address持久化到相应的关系型数据库表中。对于查询也是如此。