2016년 11월 29일 화요일

[자바강의,스프링강의,JPA강의추천_탑크리에듀][JPA팁,JPa강좌]orphanRemoval = true vs DDL의 On Delete Cascade vs CascadeType.REMOVE 차이점

[JPA팁,JPa강좌]orphanRemoval = true vs DDL의 On Delete Cascade vs CascadeType.REMOVE 차이점

먼저 예문을 보자.

@Entity
class Emp {
@OneToOne(orphanRemoval=true)
    private Addr addr;
}
Emp 엔티티가 삭제될 때 참조가 끊어진 연관된 Addr 엔티티도 삭제하라는 의미이며 DB에서도 삭제되는데 참조(연결)가 끊어진 Addr 객체는 DB에서도 삭제된다는 뜻이다.

@Entity
class Emp {
@OneToOne(cascade=CascadeType.REMOVE)
    private Addr addr;
}
Emp 엔티티가 삭제될 때 연관된 Addr 엔티티도 삭제하라는 의미이며 DB에서도 삭제된다.


@Entity
class Emp {
@OneToMany(orphanRemoval=true)
    private List<Addr> addr;
}
addresses 컬렉션에서 Addr 객체가 제거되는 경우 DB에서도 삭제하라는 의미.

orphanRemoval은 JPA2.0 이상에서 지원하는 것으로 ORM 스펙, JPA 레벨에서의 정의이고 On Delete Cascade는 DBMS 레벨에서 작동되며 하는 일은 같다. orphanRemoval @OneToMany 연관에서 부모 엔티티의 컬렉션 등에서 자식 엔티티가 삭제될 때 참조가 끊어지므로 DB 레벨에서도 삭제되고 @OneToOne연관에서 엔티티가 삭제될 때 연관된 엔티티가 참조가 끊어지므로 DB에서 삭제된다즉 참조연결이 끊어진(Disconnected엔티티를 같이 삭제하라는 의미로 Owner 객체와 참조가 끊어진 객체들을 정리할 때 유용하다.

cascade=CascadeType.REMOVE는 연결이 끊어진다고 해서 자동 삭제되는 것은 아니고 명시적으로 연관 엔티티가 삭제될 때 같이 삭제하라는 영속성 전이와 관련된 옵션이다.

반면 On Delete Cascade는 DB레벨에서 부모 테이블의 레코드가 삭제될 때 자식레코드도 같이 삭제하라는 의미이다.

[자바강의,스프링강의,JPA강의추천_탑크리에듀]JPA강좌,QueryDSL4.X 조회, 수정, 삭제, update, delete 배치쿼리, JPADeleteClause, JPAUpdateClause

JPA강좌,QueryDSL4.X 조회수정삭제, update, delete 배치쿼리, JPADeleteClause, JPAUpdateClause

n  데이터 조회 쿼리작성
JPAQuery 직접 생성하는 경우

import static model.QEmp.emp;

@PersistenceContext
EntityManager em;

JPAQuery<?> query = new JPAQuery<Void>(em);
Emp emp = query.select(emp).from(emp)
           .where(emp.empno.eq(7369))
           .fetchOne();  //한건만 추출

JPAQueryFactory를 이용한다면
(내부적으로 JPAQuery 인스턴스를 가지고 있다.)

[스프링 설정 파일에서 JPAQueryFactory를 빈으,로 등록]
@Bean
public JPAQueryFactory queryFactory() {
           //return new JPAQueryFactory(JPQLTemplates.DEFAULT, em);
           return new JPAQueryFactory(em);
}

[Repository 구현체에서]

import static model.QEmp.emp;

@Autowired
JPAQueryFactory queryFactory;

Emp emp = queryFactory.selectFrom(emp)
           .where(emp.empno.eq(7369))
           .fetch();


n  수정
[JPAQuery 또는 JPAQueryFactory 두방법 모두 가능]
Long affectedRow  = new JPAUpdateClause(em, emp)
           .where(emp.empno.eq(empno))
           .set(emp.ename, newEname)
           .execute();        

[JPAQueryFactory 방법]
// update 메소드 내부에서 JPAUpdateClause를 사용한다.
Long affectedRow = queryFactory.update(emp)
           .where(emp.empno.eq(empno))
           .set(emp.ename, newEname)
           .execute();


n  삭제
[JPAQuery 또는 JPAQueryFactory 두방법 모두 가능]

Long affectedRow =new JPADeleteClause(em, emp)
        .where(emp.job.eq(job))
.execute();                 

[JPAQueryFactory 방법]
// delete 메소드 내부에서 JPADeleteClause를 사용한다.
Long affectedRow = queryFactory.delete(emp)
    .where(emp.job.eq(job))
    .execute();


[자바강의,스프링강의,JPA강의추천_탑크리에듀]JPA교육,QueryDSL4.X강좌:JPAQuery,JPAQueryFactory인스턴스 생성방법

JPA교육,QueryDSL4.X강좌:JPAQuery,JPAQueryFactory인스턴스 생성방법


첨부파일 참조하세요.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=203

[자바강의,스프링강의,JPA강의추천_탑크리에듀]JPA,QueryDSL4.X강좌,메이븐(Maven) 설정하기

JPA,QueryDSL4.X강좌,메이븐(Maven) 설정하기

n  JPA, JDO, MongoDB, Java Collection, Hibernate Search등에서 지원하며 Spring Data 프로젝트에서 지원하는 오픈소스 프로젝트 이다.
n  Criteria 처럼 JPQL을 위한 빌더이며 메소드코드 기반으로 컴파일 시점에 에러 확인이 가능하다.
첨부 파일 참조하세요~
감사합니다.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=202

[자바강의,스프링강의,JPA강의추천_탑크리에듀][Spring JPA교육]1 : 1 단방향, 대상테이블에 외래키(JPA 1.0, JPA2.0),@OneToOne,예문입니다.

[Spring JPA교육]1 : 1 단방향, 대상테이블에 외래키(JPA 1.0, JPA2.0),@OneToOne,예문입니다.

첨부 파일 참조 부탁 드립니다.
감사합니다.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=201

[자바강의,스프링강의,JPA강의추천_탑크리에듀][스프링JPA]Querydsl,SQLQueryFactory사용위한메이븐설정,pom.xml

[스프링JPA]Querydsl,SQLQueryFactory사용위한메이븐설정,pom.xml 

 DB스키마 구조대로 자바쪽에 쿼리 타입(Query Type)을 생성해야 하므로 querydsl-maven-plugin 플러그인을 추가해야 하고, Spring Data JPA에서 SQLQueryFactory를 이용하여 Native SQL을 JPA 메소드 기반으로 실행하기 위해 기존 Querydsl 설정에 추가로 querydsl-sql-spring 의존성과 쿼리 타입의 Hibernate Validation을 위해  hibernate-validator 추가해야 한다. 


[pom.xml] 

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>ojc.edu</groupId> 
<artifactId>ojc.nativesql</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>nativesql-exam1</name> 
<description>jpa native sql example</description> 

<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.3.3.RELEASE</version> 
<relativePath /> <!-- lookup parent from repository --> 
</parent> 

<properties> 
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
<java.version>1.8</java.version> 
<querydsl.version>4.0.8</querydsl.version> 
</properties> 

<dependencies> 
<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-data-jpa</artifactId> 
</dependency> 

<dependency> 
<groupId>mysql</groupId> 
<artifactId>mysql-connector-java</artifactId> 
<version>5.1.38</version> 
<scope>runtime</scope> 
</dependency> 
<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-test</artifactId> 
<scope>test</scope> 
</dependency> 
<dependency> 
<groupId>com.querydsl</groupId> 
<artifactId>querydsl-jpa</artifactId> 
<version>${querydsl.version}</version> 
</dependency> 
<dependency> 
<groupId>com.querydsl</groupId> 
<artifactId>querydsl-sql-spring</artifactId> 
<version>${querydsl.version}</version> 
</dependency> 
<dependency> 
<groupId>org.hibernate</groupId> 
<artifactId>hibernate-validator</artifactId> 
</dependency> 
</dependencies> 
<build> 
<plugins> 
<plugin> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-maven-plugin</artifactId> 
</plugin> 
<plugin> 
<groupId>com.querydsl</groupId> 
<artifactId>querydsl-maven-plugin</artifactId> 
<version>${querydsl.version}</version> 
<executions> 
<execution> 
<goals> 
<goal>export</goal> 
</goals> 
</execution> 
</executions> 
<configuration> 
<jdbcDriver>com.mysql.jdbc.Driver</jdbcDriver> <jdbcUrl>jdbc:mysql://localhost/nativesql1?createDatabaseIfNotExist=true</jdbcUrl> 
<jdbcUser>root</jdbcUser> 
<jdbcPassword>1111</jdbcPassword> 
<packageName>jpa.model</packageName> 
<targetFolder>target/generated-sources/java</targetFolder> 
<namePrefix>S</namePrefix> 
<!-- targetFolder에 Dept.java, Emp.java를 생성 --> 
<exportBeans>true</exportBeans> 
</configuration> 
<dependencies> 
<dependency> 
<groupId>mysql</groupId> 
<artifactId>mysql-connector-java</artifactId> 
<version>5.1.38</version> 
<scope>compile</scope> 
</dependency> 
</dependencies> 
</plugin> 
</plugins> 
</build> 
</project>


[자바강의,스프링강의,JPA강의추천_탑크리에듀][Querydsl강좌]스프링부트에서 SQLQueryFactory생성 및 쿼리사용 예문,Querydsl예문

[Querydsl강좌]스프링부트에서 SQLQueryFactory생성 및 쿼리사용 예문,Querydsl예문

예문을 실행하기 전에 이전 강좌를 참조하여 MAVEN을 통해 쿼리 타입을 만들어야 한다.

첨부 파일 참조하세요. 감사합니다.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=199

[자바강의,스프링강의,JPA강의추천_탑크리에듀]JPA쿼리강좌(네이티브쿼리,Native Query/SQL),createNativeQuery,JPQL

JPA쿼리강좌(네이티브쿼리,Native Query/SQL),createNativeQuery,JPQL
n  JPA에서 엔티티를 기반으로 JPQL을 직접 작성하거나 또는 SQL 쿼리를 타입 세이프한 방식인 메소드기반 형태로 쿼리를 만들면 JPQL(Java Persistence Query Language)로 변환되고 이것이 JPA 구현체 하이버네이트 같은 것에 의해 SQL문으로 변환되어 DB에서 실행된다.

n  JPA JAVA 영속성 관리를 위한 SQL 작성 표준 API로 JPA에서 지원하는 않고 해당 DB에서만 사용 가능한 쿼리라면 Native SQL을 사용해서 DB에서 사용하는 SQL구문 형식 그대로 쿼리를 작성하면 된다.

n  Native SQL을 사용하는 방법은 간단하다. EntityManager의 createNativeQuery() 메소드를 이용하거나 Spring Data JPA를 사용한다면 @Query nativeQuery=true 라고 하면 DB에서 사용하는 SQL 구문을 직접 사용할 수 있다.

첨부 파일 참조 하세요~

감사합니다.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=198

[자바강의,스프링강의,JPA강의추천_탑크리에듀][Querydsl교육강좌]SQLQueryFactory 및 쿼리타입생성을 위한 메이븐설정/MySQL,마리아DB/querydsl-maven-plugin

[Querydsl교육강좌]SQLQueryFactory 및 쿼리타입생성을 위한 메이븐설정/MySQL,마리아DB/querydsl-maven-plugin

n  SQLQueryFactory는 자바쪽에 엔티티를 생성하지 않은 상태에서 DB에 질의 하기 위해 사용하는데, JPA의 메소드 기반으로 DB에 쿼리 할 수 있다그렇게 하기 위해 DB 스키마와 같은 쿼리 타입(Query Type)을 자바단에 만들어 두어야 하는데 그 과정을 Code Generation(코드 제너레이션이라고 한다.

n  메이븐을 통해 쿼리 타입을 생성하고, Spring Data JPA에서 메소드 기반으로 타입 세이프하게 DB에 쿼리하기 위해서는 메이븐 설정에 querydsl-sql 또는 querydsl-sql-spring(스프링에서 사용하는 경우의존성을 추가하고 querydsl-maven-plugin을 이용하여 DB스키마 구조대로 쿼리를 위한 쿼리타입 클래스(QXXX)를 만들 수 있다.

n  SQL문을 DB에서 직접 사용하는 SQL구문으로 만들어 네이티브 쿼리(Native Query)로 실행한다면 쿼리를 SQL 문자열로 만들어야 한다이 경우 쿼리 디버깅과 구문오류오타등 예기치 않은 오류가 발생할 가능성이 크다. SQLQueryFactory을 이용하면 기존 Native SQL 형태로 SQL구문을 사용하던 부분을 JPA 메소드 기반 형식으로 일부 사용할 수 있을 것이다.

첨부 파일 참조 하세요~
감사합니다.

첨부파일 URL참조 - http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=197