2012-03-14 24 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