扫描
Entity 类、Repository 类会被自动扫描到并注册到 Spring 容器, 此时无需额外配置. 当不在同一包或不在子包下时, 需要分别通过在启动类上加注解 @EntityScan(basePackages = {“xxx.xxx”}) 允许多处有交集、@EnableJpaRepositories(basePackages = {“xxx.xxx”}) 允许多处不能交集 来分别指定 Entity、Repository 类的包名
JPA 不用 @Repository
spring 有两种方式识别dao层,一种是注解的 @Repository,一种是继承 Repository 接口.
然而, 大多数框架都有自己的一套扫描规则, 实际不用使用 @Repository, 如 Mybatis 有@MapperScanner 扫描后自动注入
实体类注解
实体类属性

JPA命名查询原理
get/find 与 by之间的字段会被忽略:getNameById == getById,会根据 id 查出整个Entity而不会只查 name 字段
JPA的 select 操作
Repository 中 @Query
JPA的 update 操作
Repository 中 @Modifying + @Query
JpaRepository
findOne()与getOne():findOne立即加载;getOne延迟加载
表关系
@OneToMany(targetEntity = LinkMan.class)
@JoinColumn(name = "外键名称" referencedColumnName = "cust_id")
private Set<LinkMan> linkMans = new HashSet<>();
@ManyToOne(targetEntity = Customer.class)
@JoinColumn(name = "外键名称" referencedColumnName = "cust_id")
private Customer customer;
@JoinColumn/@PrimaryKeyJoinColumn、@MapsId
@JoinColumn用来指定外键,其name属性指定该注解所在Entity对应的表的一个列名
外键属性不是主键的场景(第一种),用 @OneToOne/@ManyToOne + @JoinColumn 即可,为了简洁推荐不用@MapIds,示例见上面的school_id关联school id设置
外键属性是主键的场景(第二种),用 @OneToOne + @JoinColumn + @MapsId ,示例见上面的student id关联user id设置
在一对多或一对一的关系映射中,如果不表明mappedBy属性,默认是由本方维护外键。
将维护权交给多的一方. 在一的一方配置上 mappedBy 属性,将维护权交给多的一方来维护

对于单字段的可以直接在方法名加Containing
@Query("select s from SchoolEntity s where s.customerId=?1 and (?2 is null or s.name like %?2% or s.bz like %?2% ) ")
List<User> getByUserId(String userId, Pageable pageable);
@Query( "select * from student where id in ?1", nativeQuery=true)
//@Query( "select s from StudentEntity s where s.id in ?1")
List<StudentEntity> myGetByIdIn(Collection<String> studentIds );//复杂查询,自定义查询逻辑
List<StudentEntity> getByIdIn( Collection<String> studentIds );//简单查询,声明语句即可
用于有依赖关系的实体间(@OneToMany、@ManyToOne、@OneToOne)的级联操作:当对一个实体进行某种操作时,若该实体加了与该操作相关的级联标记,则该操作会传播到与该实体关联的实体(即对被级联标记的实体施加某种与级联标记对应的操作时,与该实体相关联的其他实体也会被施加该操作)。包括:
@OneToMany(targetEntity = LinkMan.class, cascade = CascadeType.ALL)
@JoinColumn(name = "外键名称" referencedColumnName = "cust_id")
private Set<LinkMan> linkMans = new HashSet<>();
注:级联应该标记在One的一方 。如对于 @OneToMany的Person 和 @ManyToOne的Phone,若将- CascadeType.REMOVE标记在Phone则删除Phone也会删除Person,显然是错的。慎用CascadeType.ALL,应该根据业务需求选择所需的级联关系,否则可能酿成大祸