2016년 3월 23일 수요일

[스프링JPA엔티티매핑강좌]List컬렉션,@OrderColumn사용주의사항,@ManyToMany,다:다,1:다연관관계

이전 @ManyToMany 예제에서 List 컬렉션에서 데이터가 삭제되는 경우 delete후 update 
쿼리가 하이버네이트에서 내부적으로 실행된다. 이 부분에 대해 자세히 알아보자.

List 구조는 순서라는 개념이 있으니 개체를 List와 같은 컬렉션에서 삭제하는 경우 주의해야 한다. 

예문을 통해 알아보자.

[JPA,Querydsl강좌]JPA Query(QueryDSL4.X) –쿼리결과를 특정빈에 담기(Bean population) 

 쿼리 결과를 엔티티가 아닌 특정한 자바객체(DTO, VO)로 받고 싶은 경우 Pjojections를 사용하면 되는데 .bean()을 사용하면 Setter로 값을 채우고 .field()라고 하면 필드(멤버변수)에 직접 접근하여 값을 채우며, .constructor() 라고 하면 생성자를 통해 값을 채운다. 

[ename, sal 필드를 갖는 EmpDTO가 있다면] 

아래는 Setter를 통해 값을 저장한다. 

List<EmpDTO> dtos = query 
.select( 
Projections.bean(EmpDTO.class, emp.ename, emp.sal)) 
.fetch(); 

아래는 필드에 직접 값을 저장한다. 

List<EmpDTO> dtos = query 
.select( 
 Projections.fields(EmpDTO.class, emp.ename, emp.sal)) 
.fetch(); 
[jpa강좌]JPA기초,엔티티식별자매핑(Entity Mapping),@Id,@IdClass,@EmbeddedId, @Embeddedable,@GeneratedValue,GenerationType.TABLE,GeneratedType.IDENTITY,GenerationType.AUTO,GenerationType.SEQUENCE

첨부파일 참조하세요~

[스프링Data JPA,엔티티매핑]OneToMany, 마리아DB예제,엔티티매핑,조인,JPA강좌

§스프링 부트, 마리아DB를 사용하여 M:1 관계 양방향 관계 예제를 작성해보자.
(마리아 DB 설치는 위 URL에서 참조)

감사합니다.
[JPA엔티티매핑]N:1단방향 연관관계,@ManyToOne, @JoinTable, @OnDelete, @ForeignKey

n  사원, 부서관계 처럼 N:1 형태의 관계를 이야기 하는데 Emp에서 Dept의 칼럼을 참조하는 경우이다. (하나의 부서에는 사원이 N개, 하나의 사원은 하나의 부서에만 속하는 관계)

첨부 파일 참조하세요.
감사합니다.
[JPA,Querydsl팁]칼럼별칭으로정렬하는방법(orderby, alias),스프링DataJPA,Querydsl강좌

// 칼럼별칭으로 OrderBy하기 위해 
Path<Long> emp_rank = __EXPRESSION__s.numberPath(Long.class, "emp_rank"); 
Path<Long> dept_rank = __EXPRESSION__s.numberPath(Long.class, "dept_rank"); 

List<Tuple> rows = queryFactory 
.select(emp.ename, emp.sal, emp.deptno, 
SQL__EXPRESSION__s 
.rank().over()
.orderBy(emp.sal.desc()).as(emp_rank),                 SQL__EXPRESSION__s
.denseRank().over() 
.partitionBy(emp.deptno) 
.orderBy(emp.sal.desc()).as(dept_rank) 
) 
.from(emp) 
.orderBy(((Comparable__EXPRESSION__Base<Long>) emp_rank).asc(), ((Comparable__EXPRESSION__Base<Long>) dept_rank).asc()) 
.fetch(); 

select EMP.ENAME, EMP.SAL, EMP.DEPTNO, rank() over (order by EMP.SAL desc) emp_rank, dense_rank() over (partition by EMP.DEPTNO order by EMP.SAL desc) dept_rank 
from EMP EMP 
order by emp_rank asc, dept_rank asc 

|-------|-----|-------|---------|----------| 
|ename  |sal  |deptno |emp_rank |dept_rank | 
|-------|-----|-------|---------|----------| 
|KING  |5000 |10    |1        |1        | 
|FORD  |3000 |20    |2        |1        | 
|SCOTT  |3000 |20    |2        |1        | 
|JONES  |2975 |20    |4        |2        | 
|BLAKE  |2850 |30    |5        |1        | 
|CLARK  |2450 |10    |6        |2        | 
|ALLEN  |1600 |30    |7        |2        | 
|TURNER |1500 |30    |8        |3        | 
|MILLER |1300 |10    |9        |3        | 
|WARD  |1250 |30    |10      |4        | 
|MARTIN |1250 |30    |10      |4        | 
|ADAMS  |1100 |20    |12      |3        | 
|JAMES  |950  |30    |13      |5        | 
|SMITH  |800  |20    |14      |4        | 
|-------|-----|-------|---------|----------| 
[JPA강좌]JPA에서 Owner쪽과 Inverse쪽의 차이(엔티티매핑)

아래의 경우 A가 Owner이다.(A쪽은 Owning Side, B쪽은 Inverse Side)

@Entity
class A {
   @Id int id;

   @OneToOne
   B b;
}

@Entity
class B {
   @Id int id;

   @OneToOne(mappedBy="b")
   A a;
}


A a = em.find(A.class, aId);
B b = em.find(B.class, bId);
a.setB(b);

A가 Owner이므로 JPA에서는 A의 조인칼럼안의 B의 ID를 연관지어서 저장한다.

아래와 같은 경우를 보자.

A a = em.find(A.class, aId);
B b = em.find(B.class, bId);
b.setA(a);

A가 Owner 이므로 DB에는 아무런 변경사항이 저장되지 않는다.