본문 바로가기
Spring/Spring Data JPA

@OneToOne 양방향 매핑 주키(PK)공유

by 아이티.파머 2017. 9. 27.
반응형

@OneToOne 양방향 매핑 주키(PK)공유


두테이블에서 같은 키를 PK로 이용한다. 
A -> PK -> B -> FK,PK


*부모객체
메인객체 @OneToOne 선언
영속상태 정의
부모객체에 양방향 매핑의 mappedBy를 설정하여 외례키 컬럼이 생성되지 않도록 한다.

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Users implements Serializable {
    @Id
    private String email;
    @OneToOne(mappedBy = "users"
        , cascade = {
             CascadeType.PERSIST
            ,CascadeType.MERGE
           , CascadeType.REMOVE // 사용자 삭제시 FCM Key 함께 삭제
        }
    )
    private JgFCMKeyManager jgFCMKeyManager;
}

*1:1 매핑 서브객체
서브객체 OneToOne 선언
@MapsId 로 메인객체의 @Id 를 참조함 @JoinColumn 으로 명시

@Entity
public class JgFCMKeyManager {
    @Id
    private String email;

    @MapsId
    @OneToOne(cascade = {CascadeType.PERSIST ,CascadeType.MERGE})
    @JoinColumn(name = "email")
    private Users users;
}



저장 및 삭제 샘플
MapsId와 JoinColumn 을 이용하여 FK,PK를 하나의 것으로 사용한다.
저장삭제시 유의사항으로 DB에 추가삭제시 부모 자식 모두 setAttribute(....)을 해주어야 한다. 
주키를 공유하기 위해 만들어둔 @Id email 도 키 값을 set(...) 해주어야한다.



@ApiOperation(value = "FCM 사용자별 TOKEN 저장" , httpMethod = "POST")
@ApiImplicitParams(
    value = {
        @ApiImplicitParam(name = "email" , value = "" , paramType = "query")
        ,@ApiImplicitParam(name = "token" , value = "" , paramType = "query")
    }
)
@RequestMapping(value = "/api/fcmKeyManager/save" , method = RequestMethod.POST)
public void fcmKeyManagerSave(JgFCMKeyManager jgFCMKeyManager) throws Exception{ {
    Users user = new Users();
    user.setEmail("emai@live.co.kr");
    user.setUserId("123123123");
    user.setUserName("username");
    user.setBirthDate("18921213");
    user.setCellPhone("11111111111");
    user.setPassword("123123123");

    jgFCMKeyManager.setEmail("email@live.co.kr");
    jgFCMKeyManager.setToken("41234234sd1111d");

  // 양쪽다 주입
    jgFCMKeyManager.setUsers(user); 
    user.setJgFCMKeyManager(jgFCMKeyManager);

    this.userJpaRepository.save(user);
    //this.fcmKeyManagerJpaRepository.save(jgFCMKeyManager);
    //this.fcmKeyManagerJpaRepository.delete(jgFCMKeyManager);
    //this.userJpaRepository.delete(user);

}


@ApiOperation(value = "FCM TOKEN 삭제" , httpMethod = "DELETE")
@ApiImplicitParams(
    value = {
        @ApiImplicitParam(name = "key" , value = "사용자 아이디 키" , paramType = "query")
    }
)
@RequestMapping(value = "/api/fcmKeyManager/delete/{key}/" , method = RequestMethod.DELETE)
public void fcmKeyDelete(@PathVariable String key) throws Exception{
    JgFCMKeyManager jgFCMKeyManager = new JgFCMKeyManager();
    jgFCMKeyManager.setEmail(key);
    jgFCMKeyManager.setUsers(new Users(key));

    this.fcmKeyManagerJpaRepository.delete(jgFCMKeyManager);

}



반응형