标注于实体类声明语句之前,指出该 Java 类为实体类,将映射到指定的数据库表。
name(可选):实体名称。 缺省为实体类的非限定名称。该名称用于引用查询中的实体。
不与 @Table 结合时,表名默认为类名的 SnakeCase(蛇形命名法),若使用name属性,则表名为 name 值。
//以下三个类皆映射表名 student_info @Entity public class StudentInfo{...} @Entity(name="student_info") public class StudentInfo{...} @Entity @Table(name = 'student_info') public class StudentInfo{...}
当实体类与其映射的数据库表名不同名时需要使用@Table标注说明,该标注与@Entity标注并列使用,置于实体类声明语句之前。
@Entity @Table(name = "student_info", uniqueConstraints = {@UniqueConstraint(columnNames = "class_id")}) public class StudentInfo { @Column(name = "class_id") private String classId; }
表示一个简单的属性到数据库表的字段的映射,对于没有任何注解的属性,默认即为 @Basic 。
当实体的属性与其映射的数据库表的列不同名时需要使用@Column 标注说明,该注解通常置于实体的属性前或属性的getter方法之前,还可与 @Id 标注一起使用。
用于声明一个实体类的属性映射为数据库的主键列。
JPA通用策略生成器,通过 strategy 属性指定。
定义了以下几种可供选择的策略:
默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer 对应 IDENTITY,MySQL 对应 AUTO。
generator:使用指定的主键生成器时,这里设置为生成器名称。
自定义主键生成策略
@Data @Entity @Table(name = "student_info") public class StudentInfo { @Id @Column(name = "id") @GenericGenerator(name="idGenerator", strategy="uuid") @GeneratedValue(generator = "idGenerator") private String id; @Transient private String age; @Column(name = "name") private String name; }
直接映射枚举类型的字段。
value:
@Entity @Data @Table(name = "StudentInfo") public class Student { @Column @Enumerated private Sex sex; }
对于日期时间属性映射时,可使用 @Temporal 注解来调整精度。
@Data @Entity @Table(name = "student_info") public class Student { @Column @Temporal(TemporalType.DATE) private Date birthday; }
@Data @Entity @Table(name = "user_info") @DynamicInsert @DynamicUpdate public class User { @Id @Column(name = "id") @GenericGenerator(name="idGenerator", strategy="uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column(name = "name") private String name; @Basic private Integer age; @Column(name = "create_time") private Long createTime; @Column(name = "remark") private String remark; }
指定实体的访问模式(Access mode),包括AccessType.FIELD及AccessType.PROPERTY。
当需要多个属性作为复合主键时,可以把该属性做为一个内部类嵌套在实体类中,使用@EmbeddedId + @Embeddable实现:
@EmbeddedId:复合主键
@Embeddable:注释Java类的,表示类是嵌入类:
// 复合主键类 @Data @Embeddable public static class StudentId implements Serializable { @Column(name = "id") private Integer id; @Column(name = "class_id") private Integer classId; } //实体类 @Data @Entity @Table(name = "student_info") public class StudentInfo { @EmbeddedId private StudentId studentId; @Column(name = "name") private String name; }
注解复合主键的类,复合主键类必须满足:
// 复合主键类 @Data @Embeddable public static class StudentId implements Serializable { @Column(name = "id") private Integer id; @Column(name = "class_id") private Integer classId; } //实体类 @Data @Entity @IdClass(StudentId.class) @Table(name = "student_info") public class StudentInfo { @EmbeddedId private StudentId studentId; @Column(name = "name") private String name; }
// 复合主键类 @Data @Embeddable public static class StudentId implements Serializable { private Integer id; private Integer classId; } @Data @Entity @Table(name = "student_info") public class StudentInfo { @Embedded @AttributeOverrides( { @AttributeOverride(name = "id", column = @Column(name = "id")), @AttributeOverride(name = "classId", column = @Column(name = "class_id")) }) private StudentId id; @Column(name = "name") private String name; }
实体间一对一的关系。
fetch:立即加载和延迟加载
cascade:当前类对象操作了之后,级联对象的操作。
mappedBy:拥有关联关系的域,如果关系是单向的就不需要,双向关系表,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力,而另一方没有,只能被动管理,这 个属性被定义在关系的被拥有方。
orphanRemoval:如果设置为true,当关系被断开时,多方实体将被删除。否则会将对象的引用置为null。
targetEntity:表示该属性关联的实体类型。该属性通常不必指定,ORM 框架根据属性类型自动判断。
people 表(id,name,sex,birthday,address_id) address 表(id,phone,zipcode,address)
People和Address是一对一的关系。
方式一:通过外键的方式(一个实体通过外键关联到另一个实体的主键)
@JoinColum:保存表与表之间关系的字段,它要标注在实体属性上。一般修饰在主控方,用来定义一对一,一对多等关系列。
关联的实体的主键一般是用来做外键的。但如果此时不想主键作为外键,则需要设置referencedColumnName属性。
@Entity public class People { @Id @Column(name = "id") @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column(name = "name") private String name;//姓名 @Column(name = "sex") private String sex;//性别 @Column(name = "birthday") private Date birthday;//出生日期 @OneToOne(cascade=CascadeType.ALL)//People是关系的维护端,当删除 people,会级联删除 address @JoinColumn(name = "address_id", referencedColumnName = "id") private Address address;//地址 } @Entity public class Address { @Id @Column(name = "id") @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column(name = "phone") private String phone;//手机 @Column(name = "zipcode") private String zipcode;//邮政编码 @Column(name = "address") private String address;//地址 }
方式二:通过关联表的方式来保存一对一的关系。
关联表:people_address (people_id,address_id)
@JoinTable:用于构建一对多,多对多时的连接表,默认会以主控表加下划线加反转表为表名。
@Entity public class People { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Long id;//id @Column(name = "name") private String name;//姓名 @Column(name = "sex") private String sex;//性别 @Column(name = "birthday") private Timestamp birthday;//出生日期 @OneToOne(cascade=CascadeType.ALL)//People是关系的维护端 @JoinTable(name = "people_address", joinColumns = @JoinColumn(name="people_id"), inverseJoinColumns = @JoinColumn(name = "address_id")) private Address address;//地址 } @Entity public class Address { @Id @Column(name = "id") @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column(name = "phone") private String phone;//手机 @Column(name = "zipcode") private String zipcode;//邮政编码 @Column(name = "address") private String address;//地址 }
注解一对多和多对一关系。
例子
@Entity public class Author { @Id @Column(name = "id") @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column private String name;//姓名 //级联保存、更新、删除、刷新;延迟加载。当删除用户,会级联删除该用户的所有文章 //拥有mappedBy注解的实体类为关系被维护端 //mappedBy="author"中的author是Article中的author属性 @OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY) private List<Article> articleList;//文章列表 } @Entity public class Article { @Id @Column(name = "id") @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column private String title; @Lob // 大对象,映射 MySQL 的 Long Text 类型 @Basic(fetch = FetchType.LAZY) // 懒加载 @Column(nullable = false) private String content;//文章全文内容 //可选属性optional=false,表示author不能为空。删除文章,不影响用户 @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false) //设置在article表中的关联字段(外键) @JoinColumn(name="author_id") private Author author;//所属作者 }
注解多对多的关系。
角色和权限是多对多的关系。一个角色可以有多个权限,一个权限也可以被很多角色拥有。
JPA中使用@ManyToMany来注解多对多的关系,由一个关联表来维护。这个关联表的表名默认是:主表名+下划线+从表名。
这个关联表只有两个外键字段,分别指向主表ID和从表ID。字段的名称默认为:主表名+下划线+主表中的主键列名,从表名+下划线+从表中的主键列名。
例子
注意
@Data @Entity @Table(name = "user_permission") public class Permission implements Comparable<Permission> { @Id @Column(name = "id") private String id; @Column(name = "permission_name") private String permissionName; @ManyToMany(mappedBy="permissions") private Set<Role> roles; } @Data @Entity @Table(name = "user_role") public class Role { @Id @Column(name = "id") @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator") private String id; @Column(name = "create_time") private Long createTime; @Column(name = "update_time") private Long updateTime; @Column(name = "name") private String name; @Column(name = "description") private String description; @Column(name = "department_id") private String departmentId; @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinTable(name = "user_role_permission", joinColumns = {@JoinColumn(name = "role_id")}, inverseJoinColumns = {@JoinColumn(name = "permission_id")}) private List<Permission> permissions; }
到此这篇关于一文带你掌握JPA实体类注解的文章就介绍到这了,更多相关JPA实体类注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
编程 | 2023-02-24 21:36
编程 | 2023-02-21 12:51
编程 | 2023-02-21 12:47
编程 | 2023-02-21 00:15
编程 | 2023-02-21 00:08
编程 | 2023-02-20 21:46
编程 | 2023-02-20 21:42
编程 | 2023-02-20 21:36
编程 | 2023-02-20 21:32
编程 | 2023-02-20 18:12
网友评论