备注:注解按照英文字母顺序进行排序。
@Basic
1、变量的get和set方法没有加上注解,默认注解是@Basic
2、@Basic:表示一个简单的属性到数据库表的字段的映射
3、fetch:表示该属性的读取策略,有两种,默认是EAGER。EAGER是主支抓取,LAZY是延迟加载。
4、optional:表示该属性是否允许null,默认是true
@Basic(fetch = FetchType.EAGER,optional = true)
public Integer getId() {
return id;
}
@Column
1、当实体的属性变量与其映射的数据库表的列名不同,需要使用@Column。
2、可与@Id一起使用。
3、可以在@Column里面配置属性:name,length,unique,nullable。
4、@Column标注的columnDefinition属性:表示该字段在数据库中的实际类型。通常ORM框架可根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍然无法确定数据库中字段的类型是DATE,TIME,还是TIMESTAMP。
@Column(name = "name",length = 5,nullable = true,unique = false)
private String name;
@Entity
1、用于实体类的声明语句之前,指出该Java类为实体类,并映射到指定的数据库表
2、常与@Table一起用,表示映射到指定的数据库表。如果类名与数据库表名不对应,需要添加名字,见下方例子。
3、用@Entity修饰的java类是实体类,通常放在entity文件夹。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Data
@Entity
@Table(name = "STU")
@AllArgsConstructor
@NoArgsConstructor
public class Student {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name",length = 5,nullable = true,unique = false)
private String name;
@Column(name = "passwors")
private String password;
@Column(name = "address")
private String address;
}
@GeneratedValue
1、用于标注主键的生成策略。通过strategy属性指定。默认情况下,JPA会自动选择一个最适合底层数据库的主键生成策略。
2、MySQL对应的主键自增是auto increment,SQL Server对应的是identity。
//MySQL会自动适配数据表的自增
@generatedValue(strategy=GenerationType.AUTO)
@Id
private int id;
3、几种主键生成策略。
IDENTITY:采用数据库ID自增长的方式来自增主键字段。Oracle不支持这种方式。
AUTO:JPA自动选择合适的策略,是默认选项。
SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解产生序列名。MySQL不支持这种方式。Oracle支持这种方式。
TABLE:通过数据库表产生主键,框架借由表模拟序列产生主键,使用该策略可以使得应用更易于数据库移植。
@Id
用于声明一个实体类的属性映射为数据库的主键列。
@Modifying
使用JPA的时候,在dao层使用@Query进行更新/删除操作的时候,需要添加@Modifying表示更新/删除操作
@Repository
public interface CustomerRepository extends JpaRepository<Customer,Integer> , JpaSpecificationExecutor<Customer> {
/**
* 根据id进行删除
*/
@Query(value = "delete Customer where id = ?1")
@Modifying
void deleteByIdJpql(Integer id);
}
@Query(value="")
表示查询操作,value里面写SQL语句。
@Rollback(value= false)
1、设置是否会自动回滚。True会回滚,false不回滚。
2、使用原因:JPA使用jpql完成更新/删除操作,需要手动添加事务的支持。当jpql更新/删除操作结束后,会自动回滚事务,造成数据没有更新/删除的假象。因此需要添加注解 @Rollback(value=false)
@Query(value = "update Customer set custName = ? where custId = ?")
@Modifying
@Transactional // springdata jpa使用jpql执行插入,更新,删除需要手动提交事务
@Rollback(false) // 默认在执行之后,回滚事务,这里设置不回滚
void updateCustomer(String custName, long custId);
@Table
1、当实体类与其映射的数据库表名不相同的时候,需要使用@Table标注说明,@Table里的name属性需要写对应的数据库表名称。
2、@Table可以和@Entity并列使用,置于实体类声明语句之前。可写于单独语句行,也可与声明语句同行
3、@Table标注的常用选项是name,用于指明数据库的表明
4、@Table还有两个选项是catalog和schema,用于设置表的数据库目录或模式,通常为数据库名
5、uniqueConstraints选项用于设置约束条件,通常不需要设置。
@Transient
如果一个属性并非数据库表的字段映射,就一定要将其标为@Transient,ORM框架将忽略该属性,否则ORM框架会默认其注解为@Basic。
@Temporal
出生年月日应该使用@Temporal(TemporalType.DATE)在Java API中并没有定义Date类型的精度在数据库中,表示Date的精度有三种DATE:单纯日期TIME:时间TIMESTAMP:日期+时间示例代码,注解加在get方法上面
@Column
private Date birth;
@Temporal(TemporalType.DATE)//使用的日期格式为xxxx-xx-xx
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}