我对Hibernate世界很陌生。 我已经通过ER CASE TOOL(TOAD)我的数据库建模,并且我已经定义了几个用户数据类型(复合类型)。例如,假设我在PostgreSQL
中声明了一个类型ContactCREATE 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而不是自定义类型,我想要的是什么是定义一个Contact Hibernate UserType并根据Hibernate Tools的reverse.xml文件进行更改.....但是当我尝试使用我的UserType实现时,我获得了这条消息:
“org.hibernate.cfg.JDBCBinderException:在表上找到it.mypackage.FullContactInfoType类型:users列:fullcontactinfo跨越多列。只允许单列类型。 在表上找到类型it.mypackage.FullContactInfoType:users列:fullcontactinfo跨越多个列。仅允许单列类型。 “
您是否有关于如何实现此目的的简单示例的链接?到目前为止,我还没有能够映射用户数据类型...我正在考虑从ER模型中删除用户数据类型并爆炸它组成的字段。
我正在使用Hibernate 3.5.4
提前致谢并感谢您的支持。
答案 0 :(得分:1)
如果这解决了这个问题,请告诉我。以下是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)")