상속받는 엔티티 질문(outer join)

20.01.28 17:12 작성 조회수 25

0

삭제된 글입니다

답변 4

·

답변을 작성해보세요.

1

안녕하세요. jae uk choi님

우선 첫번째 질문에 대한 답은 상속관계로 처리하셨으면 이 경우 엔티티로 조회한 다음에 DTO로 변환하는 식으로 처리해야 합니다. 

        List<Product> result = em.createQuery("select p from Product p", Product.class)
                .getResultList();

        for (Product product : result) {
            if (product instanceof Kit) {
                Kit k = (Kit)product;
                System.out.println(k.getStock());
            }
            if (product instanceof Computer) {

            }
        }

순수 자바에서 상속을 처리할 때와 유사하게 처리하시면 됩니다.  물론 여기서 더 나가서 다운케스팅 코드를 깔끔하게 만들려면 비지터 패턴 같은 것을 사용할 수 있는데, 이 부분은 프로젝트 규모가 트지 않으면 득보다 실이 클수 있어서 권장하지는 않습니다. 혹시 내용이 궁금하시면 JPA 책 669p를 참고하시면 됩니다.

두번째 질문은 오류 메시지에 답이 있습니다^^ 실제 돌려보시면 오류가 발생하는데, dtype이라는 이름을 이미 사용하기 때문이지요. 데이터를 업데이트 하는 것은 하이버네이트가 처리해주고, 개발자는 대신에 읽기만 할 수 있습니다. 다음과 같이 읽기 전용으로 설정해주시면 조회가능합니다.

@Column(insertable = false, updatable = false)
private String dtype;

감사합니다^^

0

혹시 아니면 

@DiscriminatorColumn(name = "dtype")
public abstract class Product {

에서 칼럼 구분으로 dtype

가 생성되는데

얘를 조회할 수 있는 방법은 없나요..?

싱글 테이블로 사용하는 방법은 알겠는데,

private Stirng dtype 으로 선언하면 에러가 나고,

선언하지 않으면 사용할 수 없는데.. 어떤 방식으로 사용하는지 궁금합니다.

ex.

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
public abstract class Product {

@Id
@GeneratedValue
@Column(name = "product_id")
private long id;

//private String dtype;
// 이렇게 쓰면 에러. 그러면 select 후 dtype의 값을 조회하고 싶을땐?
// getDtype()..? 사용 어떤 식으로 할 수 있나요?

0

https://github.com/jaeuk2274/jpa_practice/tree/master/src/main/java/me/jaeuk/homework

에 프로젝트 올려두었습니다.

ProductRepository 클래스에 findAllProductStock 메서드입니다.

product 의 종류중에는 여러 가지가 있는데, 무형의 product는 재고를 관리하지 않습니다.

그래서 임의의 큰 숫자를 고정해서 보여줄 예정이고, 재고 관리하는 유형 자산은 재고를 보여줘야 합니다.

상품타입 재고

a상품(무형) 99999

b상품(유형) 50

좋은 강의 항상 감사드립니다 :)

0

안녕하세요. jae uk choi님

도움을 드리고 싶은데, 질문 내용만으로는 머리속에 명확하게 도메인 모델이 그려지지 않아서 정확한 답을 드릴 수가 없습니다.

궁금하신 내용을 정리해서 동작하는 예제 코드와 테스트 케이스를 만들어서, github에 올리고 링크를 주세요^^

감사합니다.