JPA注解详解

发布时间:2023-05-21

一、@Entity

@Entity是所有JPA注解中最重要的一个,表示这个类是一个JPA实体类。 在一个使用JPA的项目中,所有的实体类都需要加上@Entity注解,这个注解告诉JPA实现这个类需要被持久化。 默认情况下,实体类的类名就是表名;如果需要修改表名,可以使用@Table注解指定表名。

@Entity
@Table(name = "user")
public class User {
    ……
}

二、@Id

@Id注解表示这个属性是主键。 如果主键是单一属性,可以把@Id标注在属性上。但是,如果主键是一个复合的属性,就需要单独创建一个主键类,并在实体类上使用@IdClass注解指向它。

@Entity
public class User {
    @Id
    private Long id;
    ……
}
@Entity
@IdClass(UserPK.class)
public class User {
    @Id
    private String name;
    @Id
    private int age;
    ……
}
public class UserPK implements Serializable {
    private String name;
    private int age;
    ……
}

三、@GeneratedValue

@GeneratedValue注解表示主键的生成策略。 JPA提供了多种生成策略,常用的有IDENTITY、TABLE和SEQUENCE。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

四、@Column

@Column注解表示实体属性对应的表字段。 如果实体属性名称与表字段名称一致,@Column可以省略。

@Column(name = "user_name")
private String username;

五、@Temporal

@Temporal注解表示日期类型的属性。 如果是DATE或TIME类型的属性,需要指定日期的精度;如果是TIMESTAMP类型的属性,可以省略。

@Column
@Temporal(TemporalType.DATE)
private Date birthdate;
@Column
@Temporal(TemporalType.TIME)
private Date birthtime;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date regtime;

六、@OneToMany/@ManyToOne

@OneToMany注解表示一对多的关系。 在关系的拥有方,需要使用@JoinColumn指定外键。 @ManyToOne注解与@OneToMany相对应,表示多对一的关系,同样需要使用@JoinColumn指定外键。

@Entity
public class Department {
    @Id
    private Long id;
    @OneToMany(mappedBy = "department")
    private List<Employee> employees;
    ……
}
@Entity
public class Employee {
    @Id
    private Long id;
    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
    ……
}

七、@ManyToMany

@ManyToMany注解表示多对多的关系。 需要创建一个中间表来存储关系,也可以使用@JoinTable指定中间表的表名和字段名。

@Entity
public class Student {
    @ManyToMany
    @JoinTable(name = "student_course",
            joinColumns = @JoinColumn(name = "student_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id"))
    private List<Course> courses;
    ……
}
@Entity
public class Course {
    @ManyToMany(mappedBy = "courses")
    private List<Student> students;
    ……
}