2012-01-18 20 views
2

からクラスのインスタンスを作成します。それらの多くが存在する可能性があり、単一のもので数が異なる可能性があるので、属性をMap<Attribute, String>として保存しています。それを1つのテーブルに保持するには、アプリケーション自体のJavaタイプに関係なく、すべての値がStringに変換されます。は、私はこのような何かを持っているクラス名

しかし、それらをデータベースからロードするときに、正しいタイプにキャストする必要があります。だからAttributeクラスのtypeパラメータをクラス名文字列として保存します。

私は、リフレクションを使用して、文字列で指定されたクラスのインスタンスを取得し、それを値で埋めることができることを理解しました。

このスニペットのように:

Integer i = 17; 
String iVal = i.toString(); 
String iType = i.getClass().getName(); 

Object reVal = Class.forName(iType).newInstance(); 

しかし、私は文字列/カレンダー/整数/ダブルのいずれかとすることができる正しい型にreValをキャストする必要があります...

はこれを行うことができます?そしてもしそうなら、どうですか?

+0

スニペットでは、「reVal」はjava.lang.Classタイプです。タイプが互換性がない場合、java.lang.Classからjava.lang.Stringへの "reVal"のキャストはどうですか?それは私にとって無効な質問のようです、あなたはこれを明確にすることができますか? – piepera

+1

"それを1つのテーブルに保持する" なぜですか? –

+0

リフレクションは慎重に使用する必要があります。その使用はパフォーマンスに悪影響を与えます – Apurv

答えて

0

キャスト先を決定するためにinstanceofを使用します。 if(reVal instanceof String)result =(String)eval; ... キャストする各タイプの別々の変数が必要です

0

属性コレクションで@OneToManyを使用しない場合は、JPA 2.0 ElementCollectionを使用できます。

​​

あなたはまだ個別の表にはattribsになってしまいます。

+0

JPAを使用してMap のようなマップを作成できますか? Tは文字列/カレンダー/数字のどれですか? –

+0

はい、http://hwellmann.blogspot.com/2010/07/jpa-20-mapping-map.htmlやgoogle "jpa map elementcollection onetomany" などを参照してください。ただし、テーブルは1つしか使用できません。編集:そしてTはどんなオブジェクトであってもいけません。あなたがEmbeddableまたはEntityでアノテートしたタイプでなければなりません。 –

+0

おそらく、直列化/逆シリアル化してblobにし、逆シリアル化した後にinstanceofを使用してキャストすることができます。しかし、それはまた、スキーマの変更を必要とするだろう(そしてそれは一般的にかなり厄介かもしれない)。 http://stackoverflow.com/questions/2121860/storing-objects-in-columns-using-hibernate-jpa –

関連する問題