2009-07-15 5 views
1

주 사이트에서 최대 절전 모드 자습서를 사용하고 있으며, java.util.set 인터페이스와 함께 얼마나 많은 관계가 작동하는지 알기 위해 약간 변경하고 싶습니다. 내 매핑은 정확하고 내가 삽입 할 수있는 테이블 EVENT, PERSON 및 매핑 테이블 PERSON_EVENT.Now 테이블에 더미 값을 삽입하고 매핑 테이블에 매핑을 추가했습니다. 모든 사람의 모든 이벤트를 표시하고 싶었습니다. 이벤트 또는 그 이상에 등록하십시오. 이 코드 : 그래서최대 절전 모드 및 Java.util.set 문제

public void ShowPersonEvents() 
{ 
    Person aperson; 
    Event anEvent; 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    List<Person> persons = session.createQuery("from Person").list(); 
    for(int i =0; i< persons.size(); i++) 
    { 
     aperson = (Person) persons.get(i); 
     Set a = aperson.getEvents(); 
//   String[] events = (String[])a.toArray(new String[a.size()]); 
//    for (String e : events) 
//    { 
//     System.out.println(aperson.getLastname()+" is registerd to the" + e); 
// 
//    } 
     Iterator it = a.iterator(); 
     while(it.hasNext()) 
     { 
      System.out.println(aperson.getLastname()+" is registerd to the" +(String) it.next().toString()); 
     } 

//    System.out.println(); 
     } 
     session.getTransaction().commit(); 
    } 
} 

내가 실행할 수있는 사람 올바른 행 수 대신 같은 예를 들어, 행의 쇼 : 요셉은 opensouce 이벤트

에 등록

다음과 같이 표시됩니다.

요셉이 도메인에 등록되었습니다 [email protected]

이것은 [email protected] 형식입니다. 내가 iterator 부분에 주석을 달았을 때 ant는 문자열 배열에 캐스팅의 주석을 제거합니다. 예외가 있습니다 : arraystoreexception. 좀 잃어 버렸습니다. 여기서 뭐가 잘못 됐는지 보지 못했습니다. 제발 내가 뭘 잘못했는지 좀 보여 주시겠습니까? 독서에 감사드립니다.

답변

3

이것은 실제로 최대 절전 모드와 관련이 없습니다. 당신은 이벤트 객체의 toString()를 호출하고 있습니다 : 기본 구현을 받고있어, 그래서

(String) it.next().toString() 

당신은 Event.toString() 메소드를 오버라이드 (override)하지 않았습니다. 대신 다음과 같이 시도하십시오 :

while(it.hasNext()) { 
    Event event = (Event) it.next(); 
    System.out.println(aperson.getLastname()+" is registerd to the" + event.getName()); 
} 

이벤트를 미리 가져 와서 Hibernate HQL 쿼리를 개선 할 수도 있습니다. 이제부터는로드가 지연되어 매핑 파일에서 가져 오기 전략을 설정하지 않았다는 가정하에 각 사용자에 대한 추가 쿼리가 생성됩니다. 당신이 [email protected]을보고있는 이유는이 Object.toString() (즉, 기본 toString() 구현)를 호출의 출력 점이다

List<Person> persons = session.createQuery("from Person p left join fetch p.events").list(); 
+0

감사를 보이는 나에게 그것은 보인다 하지만 그 toString 함수를 재정의 (override)하고 싶습니다. retun this.getTitle(); 또는 그것의 어떤 조합? –

+0

예, 간단합니다 : public String toString() { return this.title; } – geofflane

1

: 같은

보십시오 뭔가. 이 구현은 @ 형식의 문자열을 반환합니다. 당신이 당신의 이벤트 클래스 정의에서 toString() 메서드를 오버라이드 (override) 이벤트의 내부 상태를보고 싶은 경우

public String toString() { 
    return String.format("Event{ID: %d, Title: %s, Date: %s}", id, title, date); 
} 

ArrayStoreException에 대한 이유는 요 u're trying to create a 문자열 [] but are passing in objects that are not 문자열 s (they're Event들). ArrayStoreException Javadoc :

"잘못된 유형의 개체를 개체 배열에 저장하려고 시도했음을 나타 내기 위해 throw됩니다."

따라서 toArray(new Event[a.size()])을 호출하여 배열을 만들어야합니다.당신은 우리에게 클래스 그래서 난 단지 추측 할 수 사람이벤트의 구현을 표시하지 않은

+0

은 매우 만족 스럽습니다. 감사합니다. –

+0

나는 그것이 반환하는 것이 이벤트 객체라는 사실을 완전히 무시했습니다. –

1

. 당신이 toString 방법 의 이벤트 클래스를 오버라이드 (override)하지 않은 것처럼 출력이 Object에서 상속 toString 방법의 결과처럼 남았어요 접근 방식이 나와 함께 잘 작동