Jpa 实体类常用注解

4 篇文章 1 订阅

记录一些spring-data-jpa常用的注解,代码运行环境:spring boot + spring-data-jpa

1. @Entity

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

2. @Table

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

@Table中的参数(不常用)

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

3. @Id

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

4. @GeneratedValue

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

5. @Basic

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

6. @Column

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

7. @Transient

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

8. @Temporal

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

9. @Embedded 和 @Embeddable

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

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

10. @JoinColumn

定义表关联的外键字段名
常用参数有:
  1. name: 指定映射到数据库中的外键的字段名
  2. unique: 是否唯一,默认为false
  3. nullable: 是否允许为null,默认为true
  4. insertable: 是否允许插入,默认为true
  5. updatetable: 是否允许更新,默认为true
  6. columnDefinition: 指定该属性映射到数据库中的实际类型,通常是自动判断。
  7. foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT):指定外键相关信息,这里用法是指定外联关系但是不建立数据库外键

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{//身份证
  //...
}
//双向 一对一
@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;
  //...
}

以上例子,双向一对一,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;
  //...
}
//双向 多对一
@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;
  //...
}

无论双向关联还是单向关联,数据库中均会在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{
  //...
}
//双向 多对多
@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;
  //...
}

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

14. @Enumerated

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

@Enumerated(EnumType.STRING)
@Column(nullable = true)
private RoleEnum role;


有错误欢迎指出_

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤生成JPA实体类: 1. 定义实体类 首先,在Java Package中创建一个新类,该类将成为您的数据表的实体类。这个类应该包含所有的字段,以及它们的getter和setter方法。 例如,如果您要创建一个名为“Person”的实体类,可以包含以下字段: ``` @Column(name="id") private Long id; @Column(name="name") private String name; @Column(name="age") private int age; ``` 2. 定义主键 在JPA中,每个实体类都必须有一个主键。您可以使用@Id注解来定义主键字段。 例如: ``` @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Long id; ``` 这个例子中,我们使用@Id注解来标识id字段作为主键,并使用@GeneratedValue注解来指定主键的生成策略。 3. 定义关联关系 如果您的数据表与其他表有关联关系,例如一对多或多对多关系,您需要使用@OneToMany、@ManyToOne或@ManyToMany注解来定义它们。 例如,如果您的Person实体类需要与Address实体类建立一对多关系,可以使用以下代码: ``` @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) private List<Address> addresses; ``` 这个例子中,使用@OneToMany注解来定义一对多关系,并使用mappedBy属性来指定关系的反方向属性。 4. 定义其他注解 您还可以使用其他JPA注解来定义实体类,例如@Table、@Column、@Temporal等。 例如,如果您要指定数据表的名称和日期字段的类型,可以使用以下代码: ``` @Entity @Table(name = "person") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Long id; @Column(name="name") private String name; @Column(name="age") private int age; @Temporal(TemporalType.DATE) @Column(name="date_of_birth") private Date dateOfBirth; // ... } ``` 这个例子中,我们使用@Entity和@Table注解指定实体类对应的数据表和名称,使用@Temporal注解指定日期字段的类型。 5. 生成数据库表 最后,您可以使用JPA提供的自动创建表功能来生成数据库表。只需在应用程序启动时添加以下代码即可: ``` EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit"); EntityManager em = emf.createEntityManager(); ``` 这个例子中,我们使用Persistence.createEntityManagerFactory()方法创建一个EntityManagerFactory对象,并使用它来创建一个EntityManager对象。您可以使用EntityManager对象来执行各种数据库操作,例如插入、更新、删除和查询数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值