2012-02-28 12 views
0

タペストリー値エンコーダーをハイバネート複合キーで動作させようとしています。私は次のコードを持っていると私は複合IDを取得し、後でオブジェクトにデコードするためにサーバーに戻って送信することができるインターフェイスに渡そうとしています。Tapestry5値エンコーダー(Hibernateコンポジットキー付き)

以下は私の価値エンコーダです。 toClientは、コンポジットキーをインターフェイスに送信する必要がある場所です。複合キーを取得する方法がわかりません。

@SuppressWarnings("unchecked") 
public LabelAwareValueEncoder getEncoderVendor() { 
    return new LabelAwareValueEncoder<IfasvVendor>() { 

     public String toClient(IfasvVendor value) { 
      return value.getIfasvVendorPK().toString(); 
     } 

     public IfasvVendor toValue(String clientValue) { 
      if (clientValue.isEmpty()) { 
       return null; 
      } 

      return (IfasvVendor) session.get(IfasvVendor.class, clientValue); 
     } 

     public String getLabel(IfasvVendor value) { 
      return value.getPeNameU(); 
     } 
    }; 
} 

誰かが私はより良い私は私の値エンコーダの作業を取得できるよう複合キーの操作方法を理解するのに役立つことができれば、それをいただければ幸いです。前もって感謝します。私は、これは動作するはずわからない

この時点で

return (IfasvVendor) session.get(IfasvVendor.class, clientValue);

IfasvVendorPK.toString()

によって生成されたとして、あなたの「clientValue」は、文字列です:

+1

1. IfasvVendorクラスにtoString()の実装を示してください。 2.セッション変数のタイプは何ですか? 3.セッションでIfasvVendorオブジェクトが使用可能になっていますか?セッションよりもデータストアから取得することをお勧めします。 – Jeshurun

答えて

1

Hibernateはこの文字列の意味を知る方法がなく、変換できません。 非コンポジットIDを追加するか、値を連結してからtoValueメソッドで再び分割することをお勧めします。

ValueEncoderをリクエスト(たとえば@Persistなど)より長くしておくと、HashMapをその中に置くことで、コンカテネータのクライアントキーのオブジェクトを簡単に取得できます。

Compositeキーがシリアル化可能なので、toClientでシリアル化してtoValueでデシリアライズすることができます。しかし、私は本当にそれをしません、シリアル化のものをそれをブラウザに送信し、バックは大きな、邪悪なセキュリティホールです。

+0

非複合IDを使用するようにデータベースを変更したため、値を連結することができませんでした。私はJumpstart内で@Persistを使用しないメソッドを使用していますが、これはサーバー側の検証を除いて正常に動作するようです。シリアライズがどのように大きなセキュリティホールになる可能性があるかを詳しく説明できますか?ありがとう。 –

+0

をシリアル化の質問に変換する:オブジェクト全体(IDだけでなく)をシリアル化する場合、任意のオブジェクトを他のシリアル化されたオブジェクトと置き換えるだけで、任意のオブジェクトを注入することができます。 。私はそれが簡単だとは思わないが、それを悪用することは可能である。 – dube

0

私はこの問題は、あなたの行にあると思います休止状態で、IfasvVendorPKのインスタンスをsession.getに渡すべきではありませんか?

あなたは、これは以下で動作するかどうかをテストすることができます。

public String toClient(IfasvVendor value) { 

     // test toValue strategy (probably breaks): 
     System.out.println(
      session.get(IfasvVendor.class, value.getIfasvVendorPK().toString())); 

     // test toValue strategy (probably works): 
     System.out.println(
      session.get(IfasvVendor.class, value.getIfasvVendorPK())); 

     return value.getIfasvVendorPK().toString(); 
    } 

私が正しいのであれば、何をtoValueで行う必要があることはsession.getに送信する前にIfasvVendorPKStringバックを変換しています。

+0

私はあなたの提案を試してみる機会がありませんでした。私は今度は私の複合キーを連結してしまいました。あなたのソリューションをすぐにテストします。 –

関連する問題