2012-03-14 67 views
2

映射用戶數據類型(複合型)我很新的休眠的世界。 我已經ER CASE工具(蟾蜍)我的數據庫來建模,我已經定義了幾個用戶數據類型(複合型)。例如,假設我有一個類型的聯繫聲明爲按照PostgreSQL的如何與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的工具做反向ER模型的工程,而是因爲它被映射爲Serializable,而不是作爲一個自定義類型,我想有是定義一個跟Hibernate的用戶等級和積分,並根據反向改變我對聯繫用戶類型的定義問題Hibernate工具的.xml文件.....但是當我嘗試使用我的UserType實現時,我獲得了以下消息:

「org.hibernate.cfg.JDBCBinderException:在表上找到類型it.mypackage.FullContactInfoType:users列:fullcontactinfo跨越多個列。只允許單列類型。 類型it.mypackage.FullContactInfoType上表中找到:用戶柱:fullcontactinfo跨越多個列。只允許單列類型。 「

你有沒有關於如何實現這一目標?一個簡單的例子,一些鏈接到現在爲止,我沒有去過能夠映射用戶數據類型......我正在考慮刪除用戶數據類型從ER模型,爆炸是由至極的領域。

我使用Hibernate 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

嗨Sathish所在感謝你回答,我已經有用戶類型玩,但我沒有的強校做,當我宣佈在reveng.xml配置文件與我的用戶的映射類型我獲得了一個org.hibernate.cfg.JDBCBinderException,因爲我在我的文章上寫過。 我想做什麼,我已經通過ER的方式建模的逆向工程....但是我會再考慮你的建議,然後再試一次該解決方案....只是一個問題nullSafeGet的簽名(的ResultSet結果集,字符串[]名稱,對象所有者),而不是你報告的那個......或者我錯過了什麼? Regards – quonn 2012-03-15 08:09:57

+0

你是正確的nullSafeGet,沒有意識到我爲每個對象創建了一個數組,謝謝。另一個驗證,如果你碰巧看到http://www.hibernatespatial.org/tutorial.html鏈接的映射?有一個示例映射文件可能對同行評審有用。乾杯。 – 2012-03-15 14:34:59

+0

其實我已經開發出任意變換的對象圖向PostgreSQL所使用的行格式定義一個結構,我讓它與pgobject的在我的用戶類型綁定我的強校,但是當我看到在生成的SQL代碼,它冤屈,因爲加一個RowEconder '它沒有去做......它在內部使用,當我給PGObject setStringParameter方法....所以這是結果 '行(行(''意大利'',''國家'', '通過考試 '',345 '' 00155 ''),ROW( '' [email protected]',NULL,NULL,NULL)) '的 代替 ROW(ROW( '意大利',' 國家','Via Andrea Noale',345,'00155'),ROW('pippo @ pippo.it',null,null,null))'.... – quonn 2012-03-15 18:20:56