Spring Data JPA注解Entity使用示例详解

目录
  • 1、JPA协议中关于Entity的相关规定
    • 需要注意的是:
  • 2、常用注解
    • 2.1 JPA支持的注解
    • 2.2 常用注解
  • 3、联合主键
    • 3.1 @IdClass
    • 3.2 @Embeddable与@EmbeddedId注解使用
    • 3.3 两者的区别是什么?

1、JPA协议中关于Entity的相关规定

(1)实体是直接进行数据库持久化操作的领域对象(即一个简单的POJO),必须通过@Entity注解进行标示。

(2)实体必须有一个 public 或者 projected的无参数构造方法.

(3)持久化映射的注解可以标示在Entity的字段field上(比较适合使用Lombok的情况),如下所示

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "int(11) NOT NULL COMMENT '主键' ")
private Integer id;
@Column(columnDefinition = "varchar(30) DEFAULT '' COMMENT '书名'")
private String bookName;
@Column(columnDefinition = "int(11) DEFAULT 0  COMMENT '数量'")
private Integer amount;

除此之外,也可以将持久化注解运用在Entity里面的get/set方法上,通过我们放在get方法中,如下所示:
需要注意的是: 在实体类get方法中加注解时,必须保证set方法的存在,否则会报错

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "int(11) NOT NULL COMMENT '主键' ")
public Integer getId() {
    return id;
}
@Column(columnDefinition = "varchar(30) DEFAULT '' COMMENT '宠物名'")
public String getName() {
    return name;
}
@Column(columnDefinition = "int(11) DEFAULT NULL COMMENT '年龄'")
public Integer getAge() {
    return age;
}

需要注意的是:

在同一个Entity里面只能有一种方式生效,也就是说注解要么全部写在field上面,要么就全部写在get/set方法上

  • 只要是在@Entity的实体里面被注解标注的字段,都会被映射到数据库中,除了使用@Transient注解的字段之外。
  • 实体里面必须有一个主键。主键表示的字段可以是单个字段,也可以是复合主键字段。

2、常用注解

2.1 JPA支持的注解

2.2 常用注解

@Entity必填项。用于定义对象将会成为被JPA管理的实体,将字段映射到指定的数据库表中,使用起来很简单,直接用在实体类上面即可。

 @Target(TYPE) // 表示此注解只能用在class上面
 @Retention(RUNTIME)
 public @interface Entity {
    // 默认是实体类的名字
    String name() default "";
 }

@Table非必填项。 用于指定数据库的表名,表示此实体对应的数据库里面的表名。 默认表名和entity名字一样

  @Target(TYPE)  // 表示此注解只能用在class上面
  @Retention(RUNTIME)
  public @interface Table {
      // 表的名字,默认表名和entity名字一样
      String name() default "";
      // 表的目录
      String catalog() default "";
      // 此表所在schema
      String schema() default "";
      // 唯一性约束,在创建表的时候有用,表创建好之后后面就不需要了
      UniqueConstraint[] uniqueConstraints() default {};
      // 索引,在创建表的时候使用,表创建之后后面就不需要了
      Index[] indexes() default {};
  }
  // 单一字段唯一性约束
  uniqueConstraints = {@UniqueConstraint(name = "unique_age",columnNames = "age")}
  // 联合约束
  uniqueConstraints = {@UniqueConstraint(name = "unique_name",columnNames = {"name","age"})}
  // 索引
  indexes = {@Index(name = "nameIndex",columnList = "name")})

@Access非必填项。 用于指定entity里面的注解是写在字段上面,还是get/set方法上面生效。如果默认不填写的情况下,当实体里面的第一个注解出现在字段上或者 get/set方法上面,就以第一次出现的方式为准。

@Target( { TYPE, METHOD, FIELD }) // 表示此注解可以运用在类上(可以指定实体的默认注解生成策略),也可以用在方法上或字段上(表示可以独立设置某一个字段或者方法的生效策略)
@Retention(RUNTIME)
public @interface Access {
    AccessType value();
}
public enum AccessType {
    FIELD,
    PROPERTY
}
@Access(value = AccessType.FIELD)

@Id定义属性为数据库的主键,一个实体里面必须有一个主键,但不一定是这个注解。可以和@GeneratedValue配合使用或成对出现。

@GeneratedValue主键生成策略,如下所示:

public @interface GeneratedValue {
    // Id的生成策略
    GenerationType strategy() default AUTO;
    // 通过Sequences生成Id,常见的是Oracle数据库ID生成规则,这个时候需要配合@SequenceGenerator使用
    String generator() default "";
}
// 生成策略
public enum GenerationType {
    // 通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
    TABLE,
    // 通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式
    SEQUENCE,
    // 采用数据库Id自增长,一般用于Mysql数据库
    IDENTITY,
    // 自动选择合适的策略,是默认选项;
    AUTO
}

@Enumerated对Enum枚举类映射到数据库提供下标和name两种方式,用法就是直接映射在enum枚举类型的字段上。

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Enumerated {
    EnumType value() default ORDINAL;
}
public enum EnumType {
    // 映射枚举字段的下标
    ORDINAL,
    // 映射枚举的Name
    STRING
}

@Basic表示属性是到数据表字段的映射。如果实体的字段上没有任何注解,默认即为@Basic。也就是说默认所有的字段肯定是和数据库进行映射的,并且默认为Eager类型。

public @interface Basic {
    // EAGER 立即记载;LAZY 延迟加载;
    FetchType fetch() default EAGER;
    // 这个字段是否可以为null,默认是true
    boolean optional() default true;
}

@Transient表示非持久化属性。 JPA映射数据库的时候忽略它,与@Basic有相反的作用。

@Column 定义该属性对应数据库中的

public @interface Column {
    // 定义了被标注字段在数据库表中所对应字段的名称;
    String name() default "";
    // 表示该字段是否为唯一标识
    boolean unique() default false;
    // 数据字段是否允许为空,默认为空
    boolean nullable() default true;
    // 表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
    boolean insertable() default true;
    // 表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值
    boolean updatable() default true;
    // 表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用
    String columnDefinition() default "";
    // 表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
    String table() default "";
    // 表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
    int length() default 255;
    // 表示数值的总长度
    int precision() default 0;
    // 表示小数点所占的位数,必须和precision搭配使用
    int scale() default 0;
}

3、联合主键

3.1 @IdClass

第一步:新建一个UserInfo类里面的属性是联合主键

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserInfoID implements Serializable {
    private String name;
    private String telephone;
}

第二步 :再新建一个UserInfo的实体,采用@IdClass引用联合主键类

@Entity
@Data
@Builder
@IdClass(UserInfoID.class)
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    private Integer ages;
    @Id
    private String name;
    @Id
    private String telephone;
}

第三步:新增一个UserInfoRepo类来做持久化操作

public interface UserInfoRepo extends JpaRepository<UserInfo, UserInfoID> {
}

第四步:测试用例

@Test
public void queryIndex2(){
    userInfoRepo.save(UserInfo.builder()
    .ages(1)
    .name("jack")
    .telephone("123456789").build());
    userInfoRepo.findById(UserInfoID.builder()
            .name("jack")
            .telephone("123456789").build());
}

通过上面例子我们可以发现,我们的表的主键是primary key(name,telephone),而Entity里面不再是一个@Id字段。

执行的SQL如下:

3.2 @Embeddable与@EmbeddedId注解使用

第一步:在上面例子中的UserInfoID里面添加@Embeddable注解

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Embeddable
public class UserInfoID implements Serializable {
    private String name;
    private String telephone;
}

第二步:在UserInfo类中,删除@IdClass,添加@EmbeddeId注解,如下:

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    private Integer ages;
    @EmbeddedId
    private UserInfoID userInfoID;
    @Column(unique = true)
    private String uniqueNumber;
}

第三步:UserInfoRepo保持不变 第四步:测试用例

@Test
public void queryIndex(){
    userInfoRepo.save(UserInfo.builder()
            .ages(1)
            .userInfoID(UserInfoID.builder()
                    .name("jack")
                    .telephone("123456789").build()).build());
    userInfoRepo.findById(UserInfoID.builder()
            .name("jack")
            .telephone("123456789").build());
}

执行的SQL如下所示:

3.3 两者的区别是什么?

  • @Embedded用的是对象,@IdClass用的具体的某一个字段

以上就是Spring Data JPA注解Entity使用示例详解的详细内容,更多关于Spring Data JPA注解Entity的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题

    目录 SpringDataJpa的使用 -- 一对一.一对多.多对多 关系映射 项目依赖 项目配置 sql文件(MySQL版) 级联关系简述 @OneToOne 一对一 关系映射 1.无中间表,维护方添加外键,被维护方添加对应项 2.无中间表,维护方添加外键,被维护方不添加对应项 3.有中间表,维护方不添加外键,被维护方不添加对应项 @OneToMany.@ManyToOne 一对多 关系映射 1.无中间表,多方维护并添加外键,一方被维护 2.有中间表,多方维护,一方被维护 3.无中间表,多方维

  • Spring Data Jpa返回自定义对象的3种方法实例

    目录 方法一.简单查询直接new对象 方法二.Service层使用EntityManager 方法三.Dao层使用Map接收自定义对象 总结 tasks表对应的Entity @Entity @NoArgsConstructor @AllArgsConstructor @Table(name = "tasks") @Data public class Tasks extends BaseEntity { @Id @GeneratedValue(strategy = GenerationT

  • Spring Boot 整合持久层之Spring Data JPA

    目录 整合Spring Data JPA 1. 创建数据库 2. 创建项目 3. 数据库配置 4. 创建实体类 5. 创建 BookDao 接口 6. 创建 BookService 7. 创建 BookController 8. 测试 整合Spring Data JPA JPA (Java Persistence API)和 Spring Data 是两个范畴的概念. Hibernate 是一个 ORM 框架,JPA 则是一种ORM,JPA 和 Hibernate 的关系就像 JDBC 与 JD

  • Spring Data JPA系列QueryByExampleExecutor使用详解

    目录 1.QueryByExampleExecutor用法 1.1 介绍 1.2 QueryByExampleExecutor接口 1.3 QueryByExampleExecutor实践 1.4 Example语法详解 1.5 ExampleMatcher语法分析 2.ExampleMatcher语法暴露常用方法 2.1 忽略大小写 2.2 NULL值的Property的处理方式 2.3 忽略某些属性列表,不参与查询过滤条件 2.4 字符串默认的匹配规则 3.实践出真理 3.1 AND查询 3

  • Spring Data JPA系列JpaSpecificationExecutor用法详解

    目录 1.JpaSpecificationExecutor用法 2.JpaSpecificationExecutor语法详解 2.1 Specification 接口 2.2 Root< User >root 2.3 CriteriaQuery<?> query 2.4 CriteriaBuilder cb 在上一篇文章中,我们介绍了QueryByExampleExecutor动态查询的方法,那么今天我们来学习JpaSpecificationExecutor的详细用法. 1.Jpa

  • Spring Data JPA 注解Entity关联关系使用详解

    目录 1.OneToOne关联关系 1.1 解读OneToOne源码 1.2 mappedBy 注意事项 1.3 CascadeType 用法 1.4 orphanRemoval属性用法 1.5 orphanRemoval 和 CascadeType.REMOVE的区别 2.@JoinColumns & @JoinColumn 3.@ManyToOne & @OneToMany 3.1 Lazy机制 4.ManyToMany 4.1 利用@ManyToOne 和 @OneToMany表达多

  • Spring Data JPA注解Entity使用示例详解

    目录 1.JPA协议中关于Entity的相关规定 需要注意的是: 2.常用注解 2.1 JPA支持的注解 2.2 常用注解 3.联合主键 3.1 @IdClass 3.2 @Embeddable与@EmbeddedId注解使用 3.3 两者的区别是什么? 1.JPA协议中关于Entity的相关规定 (1)实体是直接进行数据库持久化操作的领域对象(即一个简单的POJO),必须通过@Entity注解进行标示. (2)实体必须有一个 public 或者 projected的无参数构造方法. (3)持久

  • Spring JPA之save方法示例详解

    目录 一.save(单条添加) 源码 service 层 control层 二.saveAll(批量添加) 源码 service control层 一.save(单条添加) 源码 @Transactional @Override public <S extends T> S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(enti

  • Spring Data Jpa框架最佳实践示例

    目录 前言 扩展接口用法 SPRINGDATAJPA最佳实践 一.继承SIMPLEJPAREPOSITORY实现类 二.集成QUERYDSL结构化查询 1.快速集成 2.丰富BaseJpaRepository基类 3.最终的BaseJpaRepository形态 三.集成P6SPY打印执行的SQL 结语 前言 Spring Data Jpa框架的目标是显著减少实现各种持久性存储的数据访问层所需的样板代码量. Spring Data Jpa存储库抽象中的中央接口是Repository.它需要领域实

  • Spring中@Async注解实现异步调详解

    异步调用 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继续执行下面的流程.例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法:如他们都是同步调用,则需要将他们都顺序执行完毕之后,过程才执行完毕: 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了. 概述说明 Sp

  • Spring Data的Domain Event的用法详解

    1.DDD与Spring Data DDD: domain-driven design(领域驱动设计)是复杂需求下软件开发的实现方式.有时间我将专门来讲解一下DDD. Spring Data在很多地方都是按照DDD原则进行的设计(如Repository), 这里Spring Data主要是实现了DDD的aggregate和domain event: aggregate:一系列可以看成单一单元的领域对象的组合.如订单(order)和购物清单(line-items)都是单独的对象,但是将他们当成一个

  • Spring Boot + Jpa(Hibernate) 架构基本配置详解

    1.基于springboot-1.4.0.RELEASE版本测试 2.springBoot + hibernate + Druid + MySQL + servlet(jsp) 不废话,直接上代码 一.maven的pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu

  • Spring Aop常见注解与执行顺序详解

    目录 Spring Aop 的常用注解 常见问题 示例代码 配置文件 接口类 实现类 aop 拦截器 测试类 执行结论 多切面的情况 代理失效场景 总结 Spring 一开始最强大的就是 IOC / AOP 两大核心功能,我们今天一起来学习一下 Spring AOP 常见注解和执行顺序. Spring Aop 的常用注解 首先我们一起来回顾一下 Spring Aop 中常用的几个注解: @Before 前置通知:目标方法之前执行 @After 后置通知:目标方法之后执行(始终执行) @After

  • Spring IOC 常用注解与使用实例详解

    目录 @Component @Autowired @Qualifier @Bean @ImportResource @Profile @PropertySource @Component 注解@component代表spring ioc 会把这个类扫描生成Bean实例 @Component public class Role{ @Value("1") private Long id; @Value("role_name_1") private String role

  • Spring @Conditional注解讲解及示例详解

    前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. @Conditional的定义: //此注解可以标注在类和方法上 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { Class<? extends Condition>

随机推荐