Jpa(三)----常用注解

1. @Entity

被Entity标注的实体类将会被JPA管理控制,在程序运行时,JPA会识别并映射到指定的数据库表
唯一参数name:指定实体类名称,默认为当前实体类的非限定名称。
若给了name属性值即@Entity(name="XXX"),则jpa在仓储层(数据层)进行自定义查询时,所查的表名应是XXX。
如:select s from XXX s
  • 1
  • 2
  • 3
  • 4

2. @Table

当你想生成的数据库表名与实体类名称不同时,使用 @Table(name="数据库表名"),与@Entity标注并列使用,置于实体
类声明语句之前
@Entity
@Table(name="t_student")
public class student{
  ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

@Table中的参数(不常用)

  • catalog: 用于设置表所映射到的数据库的目录
  • schema: 用于设置表所映射到的数据库的模式
  • uniqueConstraints: 设置约束条件

3. @Id

@Id 用于实体类的一个属性或者属性对应的getter方法的标注,被标注的的属性将映射为数据库主键
  • 1

4. @GeneratedValue

与@Id一同使用,用于标注主键的生成策略,通过 strategy 属性指定。默认是JPA自动选择合适的策略
在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略:
 - IDENTITY:采用数据库ID自增长的方式产生主键,Oracle 不支持这种方式。
 - AUTOJPA 自动选择合适的策略,是默认选项。
 - SEQUENCE:通过序列产生主键,通过@SequenceGenerator标注指定序列名,MySQL 不支持这种方式。
 - TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略更易于做数据库移植。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5. @Basic

@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx() 方法,默认即为@Basic(fetch=FetechType.EAGER)
@Basic参数:
  1. fetch 表示该属性的加载读取策略
    1.1 EAGER 主动抓取 (默认为EAGER)
    1.2 LAZY 延迟加载,只有用到该属性时才会去加载
  2. optional (默认为 true)
    表示该属性是否允许为null
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

6. @Column

通常置于实体的属性声明之前,可与 @Id 标注一起使用
@Column参数:
  1. name: 指定映射到数据库中的字段名
  2. unique: 是否唯一,默认为false
  3. nullable: 是否允许为null,默认为true
  5. insertable: 是否允许插入,默认为true
  6. updatetable: 是否允许更新,默认为true
  7. columnDefinition: 指定该属性映射到数据库中的实际类型,通常是自动判断。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

7. @Transient

JPA会忽略该属性,不会映射到数据库中,即程序运行后数据库中将不会有该字段
  • 1

8. @Temporal

Java中没有定义 Date 类型的精度,而数据库中,表示时间类型的数据有 DATE,TIME,TIMESTAMP三种精度
  - @Temporal(TemporalType.DATE) 表示映射到数据库中的时间类型为 DATE,只有日期
  - @Temporal(TemporalType.TIME) 表示映射到数据库中的时间类型为 TIME,只有时间
  - @Temporal(TemporalType.TIMESTAMP) 表示映射到数据库中的时间类型为 TIMESTAMP,日期和时间都有
  • 1
  • 2
  • 3
  • 4

9. @Embedded 和 @Embeddable

用于一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表
  • 1

网上有一份比较详细说明,可参考链接

10. @JoinColumn

定义表关联的外键字段名
常用参数有:
  1. name: 指定映射到数据库中的外键的字段名
  2. unique: 是否唯一,默认为false
  3. nullable: 是否允许为null,默认为true
  4. insertable: 是否允许插入,默认为true
  5. updatetable: 是否允许更新,默认为true
  6. columnDefinition: 指定该属性映射到数据库中的实际类型,通常是自动判断。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

11. @OneToOne

参数:

  • targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类
  • cascade: 级联操作策略 
    1. CascadeType.ALL 级联所有操作
    2. CascadeType.PERSIST 级联新增
    3. CascadeType.MERGE 级联归并更新
    4. CascadeType.REMOVE 级联删除
    5. CascadeType.REFRESH 级联刷新
    6. CascadeType.DETACH 级联分离
  • fetch: fetch 表示该属性的加载读取策略 (默认值为 EAGER
    1. EAGER 主动抓取
    2. LAZY 延迟加载,只有用到该属性时才会去加载
  • optional: 默认为true,关联字段是否为空 
    如果为false,则常与@JoinColumn一起使用
  • mappedBy: 指定关联关系,该参数只用于关联关系被拥有方 
    只用于双向关联@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中没有 
    @OneToOne(mappedBy = “xxx”) 
    表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方 
    • 关系拥有方:对应拥有外键的数据库表
    • 关系被拥有方:对应主键被子表引用为外键的数据库表
  • orphanRemoval:默认值为false 
    判断是否自动删除与关系拥有方不存在联系的关系被拥有方(关系被拥有方的一个主键在关系拥有方中未被引用, 
    当jpa执行更新操作时,是否删除数据库中此主键所对应的一条记录,若为true则删除)
//单向 一对一
@Entity  
public class Emp{//员工
  @Id
  @GeneratedValue
  privte Integer eId;

  @Column(length = 40)
  private String empName;

  @OneToOne(cascade = CascadeType.ALL)
  private Identity identity;
  //get,set方法省略
}

@Entity
public class Identity{//身份证
  //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
//双向 一对一
@Entity  
public class Emp{
  @Id
  @GeneratedValue
  privte Integer eId;

  @Column(length = 40)
  private String empName;

  @OneToOne(cascade = CascadeType.ALL)
  private Identity identity;
  //get,set方法省略
}

@Entity
public class Identity{
  @Id
  @GeneratedValue
  privte Integer iId;

  @OneToOne(cascade = CascadeType.ALL, mappedBy = "identity")
  private Emp emp;
  //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

以上例子,双向一对一,Emp 为关系拥有方,Identity 为关系被拥有方。 
执行spring-data-jpa新增操作时,如果通过Identity的数据访问层进行新增操作(IdentityRepository.save()) 
,Emp表和Identity表都有数据,但是不会设置这两条数据的关系,Emp表中的外键为null。 
反之,以关系拥有方Emp的数据访问层进行新增操作(EmpRepository.save()),Emp表和Identity表都有数据,并且 
设置了两条数据的关系,即Emp表中的外键也得到正确新增

12. @ManyToOne、@OneToMany

多对一(也可叫一对多,只是前后表颠倒一下而已),只有双向多对一时才用得到@OneToMany。多对一中多的一方必定是对应数据库中拥有外键的表,即是关系拥有方,@ManyToOne只用在多对一中代表多的一类中,因为mappedBy只用于关系被拥有方,所以@ManyToOne参数中不包含mappedBy

@ManyToOne参数:

  • targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类
  • cascade: 级联操作策略 
    1. CascadeType.ALL 级联所有操作
    2. CascadeType.PERSIST 级联新增
    3. CascadeType.MERGE 级联归并更新
    4. CascadeType.REMOVE 级联删除
    5. CascadeType.REFRESH 级联刷新
    6. CascadeType.DETACH 级联分离
  • fetch: fetch 表示该属性的加载读取策略(@ManyToOne 的默认值是 EAGER,@OneToMany 的默认值是 LAZY
    1. EAGER 主动抓取
    2. LAZY 延迟加载,只有用到该属性时才会去加载
  • optional: 默认为true,关联字段是否为空 
    如果为false,则常与@JoinColumn一起使用

@OneToMany 参数除上述以外还有:

  • mappedBy: 指定关联关系,该参数只用于关联关系被拥有方 
    只用于双向关联@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中没有 
    @OneToMany(mappedBy = “xxx”) 
    表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方

    • 关系拥有方:对应拥有外键的数据库表
    • 关系被拥有方:对应主键被子表引用为外键的数据库表
  • orphanRemoval:默认值为false 
    判断是否自动删除与关系拥有方不存在联系的关系被拥有方(关系被拥有方的一个主键在关系拥有方中未被引用, 
    当jpa执行更新操作时,是否删除数据库中此主键所对应的一条记录,若为true则删除)

//单向 多对一
@Entity
public class Emp{
  @Id
  @GeneratedValue
  privte Integer eId;

  @Column(length = 40)
  private String empName;

  @ManyToOne(cascade = CascadeType.ALL)
  private Dept dept;
  //...
}

@Entity
public class Dept{
  @Id
  @GeneratedValue
  privte Integer dId;

  @Column(length = 40)
  private String deptName;
  //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
//双向 多对一
@Entity
public class Emp{
  @Id
  @GeneratedValue
  privte Integer eId;

  @Column(length = 40)
  private String empName;

  @ManyToOne(cascade = CascadeType.ALL)
  private Emp emp;
  //...
}

@Entity
public class Dept{
  @Id
  @GeneratedValue
  privte Integer dId;

  @Column(length = 40)
  private String deptName;

  @OneToMany(cascade = CascadeType.ALL, mappedBy = "emp")
  private List<Emp> emps;
  //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

无论双向关联还是单向关联,数据库中均会在Emp表中自动生成一个外键(dept_d_id)

13. @ManyToMany

  • targetEntity: 指定关联实体类型,默认为被注解的属性或方法所属的类
  • cascade: 级联操作策略 
    1. CascadeType.ALL 级联所有操作
    2. CascadeType.PERSIST 级联新增
    3. CascadeType.MERGE 级联归并更新
    4. CascadeType.REMOVE 级联删除
    5. CascadeType.REFRESH 级联刷新
    6. CascadeType.DETACH 级联分离
  • fetch: fetch 表示该属性的加载读取策略 (默认值为 LAZY
    1. EAGER 主动抓取
    2. LAZY 延迟加载,只有用到该属性时才会去加载 
      • mappedBy: 指定关联关系,该参数只用于关联关系被拥有方 
        只用于双向关联@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中没有。 
        @ManyToMany(mappedBy = “xxx”) 
        表示xxx所对应的类为关系被拥有方,而关联的另一方为关系拥有方:
      • 关系拥有方:对应拥有外键的数据库表
      • 关系被拥有方:对应主键被子表引用为外键的数据库表
//单向 多对多
@Entity
public class Student{
  @ManyToMany(cascade = CascadeType.ALL)
  private List<Course> courses;
  //...
}

@Entity
public class Course{
  //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
//双向 多对多
@Entity
public class Student{
  @ManyToMany(cascade = CascadeType.ALL)
  private List<Course> courses;
  //...
}

@Entity
public class Course{
  @ManyToMany(cascade = CascadeType.ALL, mappedBy = "courses")
  private List<Student> students;
  //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

所有双向关联使用时需谨慎,查询时容易引起栈内存溢出,尽量使用单向关联

14. @Enumerated

当实体类中有枚举类型的属性时,默认情况下自动生成的数据库表中对应的字段类型是枚举的索引值,是数字类型的,若希望数据库中存储的是枚举对应的String类型,在属性上加入@Enumerated(EnumType.STRING)注解即可。

@Enumerated(EnumType.STRING)
@Column(nullable = true)
private RoleEnum role;
  • 1
  • 2
  • 3
### 回答1: JPA和MyBatis-Plus都是Java中的ORM框架,但是它们的实现方式和使用方式有所不同。 JPA是Java Persistence API的缩写,它是一种ORM规范。它定义了一组Java类和注解,可以将Java对象映射到数据库表,从而方便地进行CRUD操作。JPA的实现有Hibernate、EclipseLink等。 MyBatis-Plus是MyBatis的增强工具,它简化了MyBatis的使用,提供了一些方便的特性,例如自动生成代码、性能分析等。MyBatis-Plus还提供了一些常用的CRUD操作的方法,方便快速地进行数据库操作。 总的来说,JPA主要是面向对象的,它使用实体类映射数据库表,提供了一种更加面向对象的方式来操作数据库。而MyBatis-Plus则更加注重SQL的灵活性和效率,通过SQL语句来操作数据库。选择哪种框架,需要根据实际需求和项目特点来选择。 ### 回答2: JPA和Mybatis-Plus都是现在比较流行的ORM框架,用于Java开发领域中的数据访问与持久化。但是,它们的实现方式以及适用场景是有区别的。 1.JPA是一种ORM框架,它的本质是将Java类表述成数据库关系模型,通过自动化的映射机制,将Java类对象持久化到数据库中。JPA是一个定义标准,而Hibernate、TopLink、EclipseLink都是其实现,JPA可以通过不同的提供商来实现CRUD操作等功能。而Mybatis-Plus则是对Mybatis的增强工具库,是在Mybatis的基础上进行增强和扩展,可以通过简单的编写实体类、Mapper接口以及xml配置文件来实现数据库操作。 2.JPA的优点在于:使代码更加简洁,通过注解方式来做ORM映射,以及提供了动态查询等强大的查询功能,同时支持JTA的分布式事务。而Mybatis-Plus的优势主要在于:灵活性更高,可以自定义SQL,支持自定义Mapper,比JPA更加适合复杂的SQL查询和数据处理操作。 3.在实际使用中,JPA更适合用于单表增删改查等简单操作,而Mybatis-Plus更适合用于一些复杂的自定义SQL查询和多表关联查询等操作。JPA支持分页查询,但是在某些情况下会出现性能瓶颈,而Mybatis-Plus则对于分页查询进行了优化。 总的来说,JPA和Mybatis-Plus都有各自的优势和适用场景。在实际开发中,可以根据具体情况来选择采用哪个框架,或者同时使用两个框架来提高开发效率。 ### 回答3: JPA(Java Persistence API)和MyBatis-Plus都是Java开发领域中常用的ORM(Object-relational mapping)框架,用来简化Java对象与数据库之间的映射过程。虽然两者都可以实现ORM的功能,但有着不同的设计思路和特点,下面是它们的区别: 1. 设计思路: JPA是一种基于实体的ORM框架,即将实体类映射成数据库表,通过持久化上下文(Persistence Context)管理实体的生命周期,支持JPA API标准和JPQL查询语言。 MyBatis-Plus则是一种基于Mapper的ORM框架,即将实体对应的CURD操作都封装在Mapper接口中,并支持自定义SQL和条件构造器功能。 2. 支持数据库类型: JPA支持主流的关系型数据库,如MySQL、Oracle、PostgreSQL等,并且支持对象模型的关系继承; MyBatis-Plus同样支持主流的关系型数据库,但通过扩展MyBatis插件,还可以支持非关系型数据库,如MongoDB和HBase等。 3. 调用方式: JPA通过EntityManager实现对实体和持久化上下文(Persistence Context)的操作,通过Hibernate等ORM提供实现替换; MyBatis-Plus则是通过Mapper接口和SqlSession进行操作,其中Mapper接口与xml文件映射,SqlSession实例由MyBatis的SqlSessionFactory创建。 4. 动态SQL的支持: JPA上的动态查询使用标准JPQL语句,而MyBatis-Plus通过条件构造器和动态SQL的方式支持更加灵活的动态查询语句。 5. 性能方面: JPA映射关系复杂的实体时,会存在多级懒加载问题,影响系统性能。MyBatis-Plus则通过多表关联查询和局部加载来解决这个问题。 总体来说,JPA更加适合处理实体关系复杂,使用标准查询语言的系统,而MyBatis-Plus更适合处理动态权限控制、数据分片等场景,对要求高性能的项目更有优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值