2012-03-14 22 views
2

私はHibernateの世界ではかなり新しいです。 ER CASE TOOL(TOAD)データベースを使用してモデル化し、いくつかのユーザーデータ型(複合型)を定義しました。例えば、私はタイプの接触が ユーザーデータ型(コンポジット型)とHibernateのマッピング方法

CREATE TYPE Contact AS 
("email" Varchar, 
"phone" Varchar, 
"mobile" Varchar, 
"other" Varchar); 

今すぐ次のSQLコード

CREATE TABLE Users(
idUser Serial NOT NULL, 
login Character varying(20) NOT NULL, 
password Character varying(20) NOT NULL, 
name Character varying(30), 
surname Character varying(50), 
contact Contact 
) 

-- Add keys for table Users 

ALTER TABLE Users ADD CONSTRAINT pkIdUser PRIMARY KEY (idUser) 
; 

に私が設定して行うために、Hibernateのツールを使用していたように私は、ユーザーエンティティにそれを使用する前提とPostgreSQLの

に従うように宣言があるとしERモデルのリバースエンジニアリングですが、カスタムタイプとしてではなくシリアライズ可能なものとしてマップされているため、Contactユーザータイプの定義に問題があります。コンタクトHibernate UserTypeを定義し、その逆に変更することです。xmlファイルをHibernateツール.....しかし私はUserTypeの私の実装を使用しようとすると、私はこのメッセージを取得します:

「org.hibernate.cfg.JDBCBinderException:it.mypackage.FullContactInfoTypeが表に見られる種類:ユーザーコラム:fullcontactinfoは複数の列にまたがります。単一の列型のみが許可されます。 タイプ:it.mypackage.FullContactInfoTypeがテーブル:usersカラムに見つかりました:fullcontactinfoは複数のカラムにまたがります。単一の列型のみが許可されます。 は「

は今、私は、ユーザーのデータ型をマッピングすることができになっていませんでしたまで、あなたにこの?。を達成する方法についての簡単な例のいくつかのリンクを持っている...私は、ユーザー・データ・タイプを削除するために検討していますそれが構成されてウィッヒの分野ERモデルからと爆発する。

私はあなたのサポートのために、事前に休止状態3.5.4

よろしくと感謝を使用しています。

答えて

1

これで問題が解決するかどうか、私に教えてください。postgres/hibernatの例を以下に示します電子実装http://www.hibernatespatial.org/tutorial.html

またはこのような状況のために役に立つかもしれない他の情報片がされて:あなたは、エンティティの注釈を使用してJavaオブジェクトを宣言していると仮定してる

。 Hibernate Usertypeオブジェクトを拡張したContactUsetypeオブジェクトを作成します。

最後に
public Object nullSafeGet(ResultSet resultSet, String[] email, String[] phone, String[] mobile, String[] other, Object owner) 
throws HibernateException, SQLException { 
assert email.length == 1; 
assert phone.length == 1; 
assert mobile.length==1; 
assert other.length==1 

if (resultSet.wasNull()) { 
return null; 
} 
final Contact contactVariable = new Contact(resultSet.getObject(email[0]).toString() 
             ,resultSet.getObject(phone[0]).toString(), 
             resultSet.getObject(mobile[0]).toString(), 
             resultSet.getObject(other[0]).toString()); 
return contactVariable; 
} 

public void nullSafeSet(PreparedStatement statement, Object value, int index) 
throws HibernateException, SQLException { 
statement.setObject(index, value); 
} 
} 

ユーザーが答えるために

Users user= new User(..., new Contact ("([email protected],123-456-4566,111-11-1111,aim)") 
+0

こんにちはサティッシュはあなたに感謝、私はすでにのUserTypeで遊んでいますが、私はreveng.xmlに宣言するとき、私は、それを行うにはsuccedingわけではないオブジェクトを作成します設定ファイルmy userとのマッピングタイプ私は私の投稿に書いたようにorg.hibernate.cfg.JDBCBinderExceptionを取得します。 私はすでにERでモデル化したことをリバースエンジニアリングしようとしています....しかし、あなたの提案をさらに見て、この解決策をやり直してみましょう.... nullSafeGetのシグネチャは(ResultSet結果セット、文字列[]の名前、オブジェクトの所有者)ではなく、あなたが報告するものではありませんか?よろしくお願いします。 – quonn

+0

あなたは正しいnullSafeGetですが、各オブジェクトの配列を作成したことに気づいていません。あなたがhttp://www.hibernatespatial.org/tutorial.html linkでマッピングを見たのであれば、もう1つの検証?ピアレビューに役立つサンプルマッピングファイルがあります。乾杯。 –

+0

実際に私は、構造を定義するためにpostgresqlで使用される行形式にオブジェクトグラフを変換するRowEconderを開発しました。私はUserTypeのPGObjectにバインドさせることに成功しました。しかし、生成されたSQLコードを見ると、私はPGObjectのsetStringParameterメソッドを与えたときに内部的に使用しています....これは結果です 'ROW(' '' '' '' ''国 ''、 の代わりに のROW( '' [email protected] ''、null、null、null) '' Via Test ''、345、 '00155' ') '、' Via Andrea Noale '、345、' 00155 ')、ROW(' pippo @ pippo.it '、null、null、null)).... – quonn

関連する問題