@Entity

public class Customer {

   @OneToMany(cascadeType.ALL, orphanRemoval = true)

   @JoinColumn(name = "customer_id")

   private Set<Address> addresses;

}


1. CascadeType.ALL

Entity를 저장/수정/삭제 할 때 Addresses도 똑같이 저장/수정/삭제된다. 다만, Database레벨에서 이루어지는것이 아니라 JPA persistence provider에 의해서 이루어진다.


2. orphanRemoval = true

collection에서 Address가 삭제되는 경우 database에서도 address row를 삭제한다.


결과적으로 위와 같은 설정의 경우 Address객체의 lifeCycle은 Customer 객체에 의해서 결정되는 전형적인 composition 관계가 된다.

Posted by 용식
TAG JPA
Posted by 용식
TAG JPA, queryDSL
Posted by 용식
TAG JPA, queryDSL
Posted by 용식
TAG JPA

CMD를 진행하면서 예전에 셋팅했던 기억을 되살려 프로젝트 셋팅을

Spring-data-JPA + Hibernate로 그리고 gradle을 사용해서 셋팅을 하였다.

local에서는 embeded HSQLDB를 사용해서 메모리에 올려서 작동하도록 구성을 하였는데

이클립스에서는 간단한 JPARepository Testcase가 제대로 잘 동작을하는데 (save, findAll 등)

터미널에서 gradle build 명령을 실행하면 build도중 testcase가 실패하는 문제가 발생하였다.


에러메시지는 @Entity annotation을 달고있는 Entity 클래스가 JPA에 의해서 관리되지 않는 Entity다.. 뭐 이런 메시지..


몇번을 뒤적거리다 원인을 stackoverflow에서 찾을 수 있었다.


http://stackoverflow.com/questions/14742941/no-persistent-classes-found-when-integration-test-in-gradle


원인은 gradle은 build시에 resources와 classes 디렉토리를 별도로 만들어서 build를 하는데

JPA는 이 resources 파일들과 classes파일들이 같은 디렉토리에 존재해야 한다는 것이다. 


해결책은 build.gradle에 아래를 추가...


sourceSets.main.output.resourcesDir = sourceSets.main.output.classesDir
sourceSets.test.output.resourcesDir = sourceSets.test.output.classesDir


수정하고 돌려보니 Pass가 된다.. 

Posted by 용식
TAG gradle, JPA