如何使用Hibernate映射用户数据类型(复合类型)

我对Hibernate世界很新。 我已经通过ER CASE TOOL(TOAD)我的数据库建模,并且我已经定义了几个用户数据类型(复合类型)。 例如,假设我在PostgreSQL中声明了一个类型Contact,如下所示

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 Tools来对ER模型进行逆向工程,但我对Contact用户类型的定义有问题,因为它被映射为Serializable而不是自定义类型,我想要的是定义a联系Hibernate UserType并根据Hibernate Tools的reverse.xml文件进行更改…..但当我尝试使用UserType的实现时,我获取此消息:

“org.hibernate.cfg.JDBCBinderException:在表上找到it.mypackage.FullContactInfoType类型:users列:fullcontactinfo跨越多列。只允许单列类型。在表上找到类型it.mypackage.FullContactInfoType:users column:fullcontactinfo spans多列。只允许单列类型。“

你有一些关于如何实现这个的简单例子的链接吗? 到目前为止,我还没有能够映射用户数据类型…我正在考虑从ER模型中删除用户数据类型并爆炸它组成的字段。

我正在使用Hibernate 3.5.4

关心并提前感谢您的支持。

如果这解决了这个问题,请告诉我。 这是postgres / hibernate实现的一个例子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 ("(some@email.com,123-456-4566,111-11-1111,aim)")