• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

SELFJOIN 구성에 관해 질문 드립니다.

18.12.04 16:26 작성 조회수 117

0

안녕하세요 두번째 질문 드립니다.

시스템 개발하다 보면 필요한 코드들을 한곳에 모아 놓은 테이블로 만들어 관리 하고 계층 구조를 Tree 형태로 유지 하기 위해 self-join 방식을 사용하곤 했습니다.

jsp에서도 같은 기능을 하는 객체를 만들어 사용하고 싶은데.. 쉽지 않아 질문 드립니다.

이것 저것 옵션을 붙여 봤는데.. 생각 같이 안나와서 이게 가능한 접근 인지도 잘 모르겠네요..

코드는 아래와 같습니다.

이렇게 하고 호출하면 루프를 돌다 에라가 나는데..

상호참조 할때 처럼 옵션을 줘도 별반 차이가 없는것 같고..

답답해서 질문 드립니다.

Domain

 public class CodeTree {

@Id

@SequenceGenerator(name = "seq_codetree", sequenceName = "seq_codetree", allocationSize = 1, initialValue = 100)

@GeneratedValue(generator = "seq_codetree")

private Long codeTree_;

private String codeTreeName;

private int codeTreeOrder;

@Lob

@Type(type = "org.hibernate.type.TextType")

private String codeTreeNote;

@ManyToOne()

@JoinColumn(name = "codeTreeUp")

private CodeTree codeTreeUp;

@OneToMany(mappedBy = "codeTreeUp")

private List<CodeTree> codeTreeMember;

private String codeTreeValue1;

private String codeTreeValue2;

private LocalDateTime createDate;

private LocalDateTime modifyDate;

}

Controller

   @Autowired

private CodeTreeRepository codeTreeRepository;

@RequestMapping(value = "/code", method = RequestMethod.GET)

public ResponseEntity codeAll() {

return new ResponseEntity<>(codeTreeRepository.findAll(), HttpStatus.OK);

}

감사합니다...

답변 2

·

답변을 작성해보세요.

0

답변 감사합니다
위의 코드에 값을 입력하면서 테스트 해 보았습니다.
결과는 나왔는데.. 원하는 모양은 아니었습니다.
List 를 보면 하위 멤버를 포함하는 구조를 생각했는데.. 아래 보시는 것처럼 역으로 표현되는 문제가 있습니다.

최상위 
  -- 하위 1
 -- 하위 2

어떻게 하면 위와 같은 결과를 받을 수 있을까요?
다시한번 바쁜 시간중에 답변 주신것 감사드립니다.

[
{
"id": 1,
"codeTreeName": "최상위",
"codeTreeOrder": 0,
"codeTreeNote": null,
"codeTreeUp": null,
"codeTreeMember": null,
"codeTreeValue1": null,
"codeTreeValue2": null,
"createDate": null,
"modifyDate": null
},
{
"id": 2,
"codeTreeName": "하위",
"codeTreeOrder": 0,
"codeTreeNote": null,
"codeTreeUp": {
"id": 1,
"codeTreeName": "최상위",
"codeTreeOrder": 0,
"codeTreeNote": null,
"codeTreeUp": null,
"codeTreeMember": null,
"codeTreeValue1": null,
"codeTreeValue2": null,
"createDate": null,
"modifyDate": null
},
"codeTreeMember": null,
"codeTreeValue1": null,
"codeTreeValue2": null,
"createDate": null,
"modifyDate": null
},
{
"id": 3,
"codeTreeName": "하위2",
"codeTreeOrder": 0,
"codeTreeNote": null,
"codeTreeUp": {
"id": 1,
"codeTreeName": "최상위",
"codeTreeOrder": 0,
"codeTreeNote": null,
"codeTreeUp": null,
"codeTreeMember": null,
"codeTreeValue1": null,
"codeTreeValue2": null,
"createDate": null,
"modifyDate": null
},
"codeTreeMember": null,
"codeTreeValue1": null,
"codeTreeValue2": null,
"createDate": null,
"modifyDate": null
}
]

0

JPA 맵핑을 주제로 다룬 강좌도 아니었는데 어떤 에러인지 메시지를 보여주지 않으시면 도와드리기가 어렵습니다.

제가 실제로 위와 비슷한 설정으로 테스트를 만들어 본 결과 저 설정 만으로는 아무 이상이 없어 보입니다. 아마도 CodeTree위에 롬복 애노테이션을 사용하신거 같은데요. 거기서 StackOverFlow를 발생시켰을 가능성도 있을거 같은데 해당 코드도 역시 보이질 않으니 도와드리기가 어렵네요. 아래 코드는 제가 실행 해본 코드이며 정상 동작하는지 테스트 코드로 확인해 보았습니다.

@Entity

@Getter @Setter @EqualsAndHashCode(of = "id")

@Builder @NoArgsConstructor @AllArgsConstructor

public class CodeTree {

@Id

@GeneratedValue

private Long id;

private String codeTreeName;

private int codeTreeOrder;

private String codeTreeNote;

@ManyToOne

private CodeTree codeTreeUp;

@OneToMany(mappedBy = "codeTreeUp")

private List<CodeTree> codeTreeMember;

private String codeTreeValue1;

private String codeTreeValue2;

private LocalDateTime createDate;

private LocalDateTime modifyDate;

}

public interface CodeTreeRepository extends JpaRepository<CodeTree, Long> {

}

@RunWith(SpringRunner.class)

@DataJpaTest

public class CodeTreeRepositoryTest {

@Autowired

CodeTreeRepository codeTreeRepository;

@Test

public void findAll() {

codeTreeRepository.findAll();

}

}