当表具有UUID字段时,我可以使用Hibernate工具对Postgresql数据库进行反向工程吗?

当表具有UUID字段时,我可以使用Hibernate工具对Postgresql数据库进行反向工程吗?,hibernate,postgresql,hibernate-mapping,uuid,hibernate-tools,Hibernate,Postgresql,Hibernate Mapping,Uuid,Hibernate Tools,我希望实现以下工作流: 我在postgresql 9中设计表,我使用EclipseIndigo中的Hibernate工具为这些表生成POJO,我希望Hibernate使用注释。 使用EclipseIndigo、最新的PostgreSQLJDBC驱动程序、Java1.6和来自EclipseMarketplace的Hibernate工具,这是行不通的 反向工程向导将表的UUID字段视为其他字段,并生成类型为Serializable的字段,而不是UUID。插入POJO会抱怨有人试图将bytea数据插入

我希望实现以下工作流: 我在postgresql 9中设计表,我使用EclipseIndigo中的Hibernate工具为这些表生成POJO,我希望Hibernate使用注释。 使用EclipseIndigo、最新的PostgreSQLJDBC驱动程序、Java1.6和来自EclipseMarketplace的Hibernate工具,这是行不通的

反向工程向导将表的UUID字段视为其他字段,并生成类型为Serializable的字段,而不是UUID。插入POJO会抱怨有人试图将bytea数据插入UUID字段。简单地说:如何使用hibernate工具对POJO进行反向工程,以便自动处理UUID

以下是生成的字段:

私有可序列化实例ID

自定义用户类型 您需要使用一个自定义用户类型,告诉Hibernate如何将UUID列序列化和反序列化为java对象。这是我的(使用Hibernate 3.6.8.Final):

Hibernate映射 Hibernate映射需要为uuid属性指定用户类型的类名:

<property name="uuid" type="your.package.usertype.UUIDType">
    <column name="uuid" not-null="true" />
</property>

编辑:看起来org.hibernate.type.postgresuidtype从3.6.0.Beta1开始就存在了。您可以只使用此类型,但我认为您仍然必须在映射和直接反向工程中指定它,才能将其用于所需的列。

也许您的意思是type
serial
?不,请参见(现已编辑)问题的底部
<property name="uuid" type="your.package.usertype.UUIDType">
    <column name="uuid" not-null="true" />
</property>
<type-mapping>
    <sql-type jdbc-type="OTHER" hibernate-type="your.package.usertype.UUIDType" />
</type-mapping>
<table name="your_table">
    <column name="uuid" type="your.package.usertype.UUIDType" />
</table>
package your.package.reveng;

import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.TableIdentifier;

public class CustomReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {
    public CustomReverseEngineeringStrategy( ReverseEngineeringStrategy delegate ){
        super(delegate);
    }

    public String columnToHibernateTypeName( TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale, boolean nullable, boolean generatedIdentifier ){
        if( table.getName().equals("your_table") && columnName.equals("uuid") ){
            return "your.package.usertype.UUIDType";
        } else {
            return super.columnToHibernateTypeName( table, columnName, sqlType, length, precision, scale, nullable, generatedIdentifier );
        }
    }
}