Spring + Hibernate + ManytoOne 사용시 중복 데이터가 나오네요.

772 views
Skip to first unread message

봉성주

unread,
Jul 17, 2014, 10:23:14 PM7/17/14
to ks...@googlegroups.com
안녕하세요.

스프링3.2 + hibernate 를 사용해서 프로젝트를 진행 중입니다.

이번에 Table끼리의 Relation을 Hibernate의 @ManyToOne, @OneToMany를 이용해서 해결해 볼려고 하는데요..

설정을 통해 디비에는 데이터가 잘 들어가는데, 가져오는 데이터를 확인해보니 중복된 데이터가 ManyToOne에서 만든 

Row수 만큼 존재하네요.

캡처 부분은 데이터 테이블에 1개의 row와 그와 연결된 3개의 row를 더했는데, row의 수만큼 가져오는거 같네요..

혹시 디비에서 primary key나 foregin key로 등록이 되어 있어야 제대로 가져오는건가요?

지금은 아무런 연결도 잡혀있지 않습니다.
캡처.PNG

봉성주

unread,
Jul 17, 2014, 10:43:53 PM7/17/14
to ks...@googlegroups.com

코드쪽에서는 @OneToMany 의 fetchType 인자의 값을 제거해주니 제대로 나오기는 하는데,

해당 리스트를 눌렀을 경우 

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

이 발생하네요 좀 더 찾아봐야 될것 같습니다.

2014년 7월 18일 금요일 오전 11시 23분 14초 UTC+9, Sungju Bong 님의 말:

이재일

unread,
Jul 18, 2014, 12:35:03 AM7/18/14
to ks...@googlegroups.com
안녕하세요.

일단 객체관계가 좀 의심스럽네요. @ManyToOne과 OneToMany를 같이 썼다고 하니. 양방향 연결이 잘못된게 아닌가 싶습니다. 쉽게 가려면 ManyToOne만 쓰고 OneToMany는 안쓰는게 좀 쉽고, 꼭써야 겠다면, @OneToMany는mappedBy로 가상으로 연결하시면 됩니다.

코드가 없어서 넘겨집기가 쉽지 않네요. 작성한 코드를 올려주시면 도움이 될듯합니다.


2014년 7월 18일 금요일 오전 11시 23분 14초 UTC+9, Sungju Bong 님의 말:
안녕하세요.

봉성주

unread,
Jul 18, 2014, 12:51:13 AM7/18/14
to ks...@googlegroups.com
제가 원하는것이 @OneToMany를 써서 1개에 다수가 연결되어 있는 정보를 가져오고 싶어서요.

코드를 적어드리면 

Item.class

@OneToMany(mappedBy="item",fetch=FetchType.EAGER)
private Set<Line> lines;

Line.class

@ManyToOne
@JoinColumn(name="itemid",unique=true)
@JsonIgnore
private Item item;

제가 Item에서 Line의 리스트를 가져오는 건데요. 
혹시 다른 방법으로도 되는 방법이 있나요? 
2014년 7월 18일 금요일 오후 1시 35분 3초 UTC+9, 이재일 님의 말:

봉성주

unread,
Jul 18, 2014, 1:15:59 AM7/18/14
to ks...@googlegroups.com
 fetch=FetchType=EAGER를 제거 하고 하면 리스트에서는 중복된게 나오진 않는데, 해당 리스트를 누를경우 org.hibernate.LazyInitializationException 에러가 발생하네요..

2014년 7월 18일 금요일 오후 1시 51분 13초 UTC+9, Sungju Bong 님의 말:

최용은

unread,
Jul 18, 2014, 1:34:06 AM7/18/14
to ksug

음..  도메인코드, 도메인들을 영속화 시키는 코드를 보면 빠른 피드백이 갈 것 같습니다.

2014. 7. 18. 오후 2:16에 "Sungju Bong" <bongs...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/0fd389cd-efad-4f90-99c4-a62dadf5352d%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

봉성주

unread,
Jul 18, 2014, 2:26:07 AM7/18/14
to ks...@googlegroups.com
+최용은 

빠른 피드백에 넘어가서 보내드릴께요..

Line.class  // Many에 해당하는 클래스입니다.

@Entity
@Table(name = "AP_ITEM_LINE")
@JsonInclude(Include.NON_NULL)
public class Line implements Serializable{

@Id
@Column(name = "LINEID")
private String lineid;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="itemid",unique=true)
@JsonIgnore
private Item item;
// getter/setter는 생략했습니다.
}

ITEM.class // One에 해당하는 클래스입니다.

@Entity
@Table(name = "AP_ITEM")
@JsonInclude(Include.NON_NULL)
public class Item implements Serializable {

@Id
@Column(name = "ITEMID")
private String itemid;

@OneToMany(mappedBy="item",fetch=FetchType.EAGER)
private Set<Line> lines;

//getter/setter
}


2014년 7월 18일 금요일 오후 2시 34분 6초 UTC+9, 최용은 님의 말:

최용은

unread,
Jul 18, 2014, 11:51:10 PM7/18/14
to ksug
문제가 되는 부분이 

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

이 부분인 거죠?

화면에서 Item에 속하는 LInes를 가져오고 싶은데, 못가져오고, 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role 에러를 내뱉어서 문제가 되는 것 맞으시죠?^^;;


저건 OSIV 라고 찾아보면 해결책이 있지만(OSIV 관련 조영호님의 블로그), 화면단에서 DTO 같은걸로 만들어서 내보내주는것 아니면 ajax로 처리하는 방법도 있을 것 같습니다.

그리고 Item과 Line의 관계가 양방향성인데.. 이재일님 말처럼 @ManyToOne으로 사용해도 충분할 것 같습니다.
양방향성은 쓸때 없이 복잡해지는 경향이 있어서요^^;; (나중에 유지보수하기 힘들어요 ㅠ)



참조 자료들은



즐거운 주말 보내세요^^


2014년 7월 18일 오후 3:26, Sungju Bong <bongs...@gmail.com>님이 작성:

최용은

unread,
Jul 18, 2014, 11:58:37 PM7/18/14
to ksug
정정 합니다.

이재일님 포스팅의 제목을 잘못 달았습니다 ;ㅁ;


입니다^^;



2014년 7월 19일 오후 12:51, 최용은 <choi...@gmail.com>님이 작성:

봉성주

unread,
Jul 20, 2014, 9:59:10 PM7/20/14
to ks...@googlegroups.com
일단은
@OneToMany(mappedBy="item")
@Fetch(FetchMode.JOIN)

이렇게 해서 해결을 해놓은 상태인데.
+최용은 님 말씀대로 확인 해서 적용시켜 보겠습니다.


2014년 7월 19일 토요일 오후 12시 58분 37초 UTC+9, 최용은 님의 말:
Reply all
Reply to author
Forward
0 new messages