spring-boot 와 spring-data-JPA 의 간단 한 통합

4301 단어 SpringBoot
어떻게 boot 에서 JPA 를 쉽게 사용 합 니까?


  org.springframework.boot
  spring-boot-starter-data-jpa

 
사용자 역할 을 예 로 들 면 그 중에서 사용자 테이블,캐릭터 테이블,그리고 중간 테이블,사용자 역할 테이블 이 있 습 니 다.먼저 대응 하 는 실체 클래스 를 만 듭 니 다.
/**
 *    
  */ 
@Data
@Entity
public class Account extends DefaultValidate implements Login {
    @Id
    @GeneratedValue
    private Integer id;
 
    /**
     *    
     */
    @NotNull(message = "       ")
    @Size(min = 2, max = 50)
    @Column(name="login_name")
    private String loginName;
 
    /**
     *    
     */
    @NotNull(message = "       ")
    @Size(min = 2, max = 50)
    @Column(name="account_name")
    private String accountName;
 
    /**
     *     
     */
    @Column(name="login_pwd")
    private String loginPwd;
     
    /**
     *      
     */
    @Column(name="account_code")
    private String accountCode;
     
    /**
     *                    
     */
    @ManyToMany(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY)
    @JoinTable(name = "account_role",
    joinColumns = { @JoinColumn(name = "account_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "role_id") })
    private Set roles = new HashSet();
}

  
  
/*
 *    
 * @date 2018 3 22   10:17:11
 */
@Data
@Entity
public class Role extends DefaultValidate {
    @Id
    @GeneratedValue
    private Integer id;
 
    /**
     *     
     */
    @NotNull(message = "        ")
    @Size(min = 2, max = 50)
    @Column(name="role_code")
    private String roleCode;
 
    /**
     *     
     */
    @NotNull(message = "        ")
    @Size(min = 2, max = 50)
    @Column(name="role_name")
    private String roleName;
 
}

이렇게 대응 하 는 실체 클래스 를 만 들 수 있 습 니 다.위 에서 사용 하 는 맵 관 계 는 단 방향 다 중 입 니 다.이 어 대응 하 는 reposcory 를 만 듭 니 다.
@Repository
public interface AccountReposity extends JpaRepository {
     

}

 
사용 할 때 그 에 대응 하 는 방법 을 호출 하면 된다.이어서 대응 하 는 동적 조 회 를 소개 합 니 다.동적 조 회 는 reposcory 가 Jpa SpecificationExecutor 류 를 계승 해 야 합 니 다.
public Page mySubmission(MySubmitPageDto selectDto) {
		LOGGER.info("        。。。。") ;

		PageRequest pageable =new PageRequest(selectDto.getPageNum(), selectDto.getPageSize());
		//     
		Specification specification = new Specification() {
			/**
			 * Predicate:        
			 * root:      
			 * query:      root   ,          ,      (           query   )
			 * cb:    CriteriaBuilder       ,       Predicate  
			 */
			@Override
			public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
				List predicateList = new ArrayList();	
				predicateList.add(cb.equal(root.get("flowStarter"), selectDto.getUserCode()));
				Predicate[] p =new Predicate[predicateList.size()];
				return cb.and(predicateList.toArray(p));
			}
		};
		Page page = flowRepository.findAll(specification, pageable);
		LOGGER.info("        。。。。") ;
		return page;
	}

  
복잡 한 동적 조회 가 있 으 면 Spring-JDBC 와 결합 하여 조작 하 는 것 을 추천 합 니 다.동적 인 원생 sql 을 쓰 는 것 이 개발 하기에 편리 합 니 다.
JPA 대상 의 생명주기:
New:순간 대상,id 가 없습니다.Persistence Context 와 연 결 된 대상 이 없습니다.
Managed:관리 대상 을 지속 적 으로 유지 하고 id 값 이 있 으 며 Persistence Context 와 관련 된 대상 을 만 들 었 습 니 다.
Datached:유리 상태 오프라인 대상,id 값 이 있 지만 Persistence Context 와 관련 된 대상 이 없습니다.
Removed:삭 제 된 대상 은 id 값 이 있 고 Persistence Context 와 관련 이 있 지만 데이터베이스 에서 삭제 할 준비 가 되 어 있 습 니 다. 
JPA 에서 조회 한 대상 이 지구 상태 일 때 대상 속성 을 바 꾸 는 set 방법 을 호출 할 때 동적 으로 데이터 베 이 스 를 수정 합 니 다.통과 가능
@PersistenceContext  private EntityManager entityManger;
manager 의 clear 방법 으로 대상 을 풀 면 됩 니 다.
매개 클래스 속성 과 관련 이 있 으 면 set,get 방법 을 다시 쓸 수 있 습 니 다.예 를 들 어:
	public WarehouseStatusEnum getState() {
		return WarehouseStatusEnum.getWarehouseStatusEnum(this.state);
	}

	public void setState(WarehouseStatusEnum state) {
		this.state = state.value();
	}

좋은 웹페이지 즐겨찾기