@Id
指定实体的主键。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。
@GeneratedValue
用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
- IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
- AUTO: JPA自动选择合适的策略,是默认选项;
- SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式
- TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
@GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; 或 @GeneratedValue(strategy=GenerationType.AUTO) @Id public Integer getId() { return id; }
@Column注解
用来标识实体类中属性与数据表中字段的对应关系,可置于属性的getter方法之前。
- name:表中列的名称。默认为属性或字段名。
- unique:该列是否为唯一键,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的
- nullable:数据库列是否为空。默认为true
- insertable:表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
- updatable:表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。
- insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
- columnDefinition:(大多数情况,几乎不用)表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
- table:表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
- length:表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
- precision:十进制(精确数字)列的精度,当字段类型为double时,precision表示数值的总长度,
- scale:小数点所占的位数。仅当使用十进制列时适用
@Column(name = "id", length = 20, nullable = false) private int id; 或 @Column(name = "id", length = 20, nullable = false) public int getId() { return id; }
@JoinTable
指定关联的映射
@JoinColumn
用来指定与所操作实体或实体集合相关联的数据库表中的列字段
@OneToOne(一对一)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "address_id")
private Address address;
@OneToMany(一对多)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private List<Employee> employees;
@ManyToOne(多对一)
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private Department department;
@ManyToMany(多对多)
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "tbl_employee_role", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id") })
private List<Role> roles;
@OrderBy
// demo 表中id 升序排列
@OrderBy("id ASC")
private List<Demo> demoList;
lombok
大大提升代码开发效率
@Getter、@Setter
可以替代代码中的getter和setter方法
@ToString
对象的自我描述,实体类上注解,替代toString方法
@Getter
@Setter
public class Student {
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor
-
@NoArgsConstructor:注解在类上,为类提供一个无参的构造方法。
@NoArgsConstructor public class Student{ private String name; } // 不使用注解 public class Student{ private String name; public Student(){ } }
-
@AllArgsConstructor:为类提供一个全参的构造方法
- 默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值。
@AllArgsConstructor(access = AccessLevel.PROTECTED) public class Student{ private String name; } // 不使用注解 public class Student{ private String name; protected Student(String name){ this.name = name; } }
- 默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值。
-
@RequiredArgsConstructor:会生成构造方法(可能带参数也可能不带参数)
-
如果带参数,这参数只能是以 final 修饰的未经初始化的字段或者是以 @NonNull 注解的未经初始化的字段。
-
该注解还可以用 @RequiredArgsConstructor(staticName=“methodName”) 的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象
// 使用注解 @RequiredArgsConstructor(staticName = "hangge") public class Shape { private int x; @NonNull private double y; @NonNull private String name; } // 不使用注解 public class Shape { private int x; private double y; private String name; public Shape(double y, String name){ this.y = y; this.name = name; } public static Shape hangge(double y, String name){ return new Shape(y, name); } }
-
@Data
类加了@Data注解,所有Java代码中不需要生成getters and setters,而在编译的时候会自动生成getters and setters
@Builder
为类生成相对略微复杂的构建器API。@Builder可以让你以下面显示的那样调用你的代码,来初始化你的实例对象:
Student.builder()
.sno( "001" )
.sname( "admin" )
.sage( 18 )
.sphone( "110" )
.build();
@Slf4j、@Log4j2、@CommonsLog
- @Slf4j:日志输出的,一般会在项目每个类的开头加入该注解
节省如下代码
private final Logger logger = LoggerFactory.getLogger(当前类名.class); - @Log4j2:日志工具