How to map User Data Type (Composite Type) with Hi

2019-05-23 10:11发布

问题:

I am quite new to Hibernate world. I have modeled by means of ER CASE TOOL (TOAD) my database and I have defined several User Data Type (Composite Type). For example assume I have a type Contact declared as follow in PostgreSQL

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

Now assume i use it on Users Entity like in the following SQL code

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)
;

I have configured and used Hibernate Tools to do a reverse engineering of ER model, but I have problem on the definition of the Contact user type because it is mapped as Serializable and not as a custom type, What I am trying to have is to define a Contact Hibernate UserType and change according the reverse.xml file of the Hibernate Tools.....but when I try to use my implementation of the UserType I obtain this message:

"org.hibernate.cfg.JDBCBinderException: The type it.mypackage.FullContactInfoType found on Table: users column: fullcontactinfo spans multiple columns. Only single column types allowed. The type it.mypackage.FullContactInfoType found on Table: users column: fullcontactinfo spans multiple columns. Only single column types allowed. "

Have you some link on a simple example on how to achieve this?. Until now I was not been to able to map the user data type...I am considering to remove the User Data Type from the ER model and explode the fields of wich it is composed.

I am using Hibernate 3.5.4

Regards and thanks in advance for your support.

回答1:

Let me know if this solves the issue. Here is an example of postgres/hibernate implementation http://www.hibernatespatial.org/tutorial.html

or the other info piece that might be useful for this situation is:

Am assuming that you have declared your Java objects with the entity annotation. Create a ContactUsetype object extending Hibernate Usertype object.

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);
}
}

Finally when you create users object

Users user= new User(..., new Contact ("(some@email.com,123-456-4566,111-11-1111,aim)")