2009-07-15 22 views
1

メインサイトからハイバーネーションのチュートリアルを試していて、java.util.setインターフェースで何人から多くの関係が動作するかを知りたいことを少し変えたいと思っていました。私はテーブルEVENT、PERSON、そしてPERSON_EVENT.Nowテーブルにいくつかのダミー値を挿入し、マッピングテーブルにマッピングを追加しました。私はすべての人物のすべてのイベントを表示したいイベントまたはそれ以上に登録する。このコードで:そうhibernateと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イベント

に登録されている

これは次のようなものです。

Josephはドメインに登録されています[email protected]

これは[email protected]という形式です。 私はiteratorの部分をコメントするantは文字列配列にキャストのコメントを外します。私は例外があります:arraystoreexception。 私はちょっと迷っています。何が間違っているかはわかりません。あなたは一見して、何が間違っているのか教えてください。

答えて

3

これは実際にHibernateとは関係ありません。あなたは、イベントオブジェクトのtoString()を呼んでいる:

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

あなたはEvent.toString()メソッドをオーバーライドしていないので、あなたは、デフォルトの実装を取得しています。代わりに、次のようなものを試してみてください:

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メソッドをオーバーライドしていないように私には見えますしかし、私はtoString関数をオーバーライドしたいと思います。retun this.getTitle();のようなものを返すだけで簡単です。またはそれの任意の組み合わせ? –

+0

はい、簡単です: public String toString(){ return this.title; } – geofflane

1

のようなものを試してみてください。この実装は、@の形式の文字列を返します。あなたがあなたのイベントのクラス定義でのtoString()メソッドをオーバーライドする必要があり、イベントの内部状態を確認したい場合:

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

ArrayStoreException理由は、ヨーヨーu're trying to create aのString [] but are passing in objects that are not文字列s (they're Event秒)。 ArrayStoreException Javadoc:

"オブジェクトの配列に間違った種類のオブジェクトを格納しようとしたことを示すためにスローされました。"

したがって、toArray(new Event[a.size()])を呼び出して配列を作成する必要があります。

+0

非常に説明に満足しています。ありがとう –

+0

私はそれが返すものがイベントオブジェクトです –

1

の実装を私たちに示していない人イベントクラスなので、私は推測できます。出力はObjectから継承されます。のtoString方法man.Yourのアプローチは、私と一緒に正常に動作

関連する問題