java - 在 hibernate 中映射 PostgreSQL LTREE 列时出错

标签 java postgresql hibernate entity ltree

我正尝试在 hibernate 中映射 postgresql ltree 列,如下所示:

在实体中:

private String path;

@Column(name="org_path", columnDefinition="ltree")
public String getPath() {
   return path;

表结构:

CREATE TABLE relationship (
    relationship_id int4 NOT NULL,
    parent_organization_id uuid NOT NULL,
    child_organization_id uuid NOT NULL,
    org_path ltree NOT NULL,
    CONSTRAINT relationship_pk PRIMARY KEY (relationship_id),
    CONSTRAINT organization_fk3 FOREIGN KEY (parent_organization_id) REFERENCES organization(organization_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT organization_fk4 FOREIGN KEY (child_organization_id) REFERENCES  organization(organization_id) ON DELETE RESTRICT ON UPDATE RESTRICT
)

出现以下错误:

wrong column type encountered in column [org_path] in table [relationship]; found [“schemaName"."ltree" (Types#OTHER)], but expecting [ltree (Types#VARCHAR)]

谁能帮忙解决这个问题?

最佳答案

在 Java 中实现自定义 LTreeType 类如下:

public class LTreeType implements UserType {

    @Override
    public int[] sqlTypes() {
        return  new int[] {Types.OTHER};
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Class returnedClass() {
        return String.class;
    }

    @Override
    public boolean equals(Object x, Object y) throws HibernateException {
        return x.equals(y);
    }

    @Override
    public int hashCode(Object x) throws HibernateException {
        return x.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
            throws HibernateException, SQLException {
        return rs.getString(names[0]);
    }

    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException {
        st.setObject(index, value, Types.OTHER);
    }

    @Override
    public Object deepCopy(Object value) throws HibernateException {
        return new String((String)value);
    }

    @Override
    public boolean isMutable() {
        return false;
    }

    @Override
    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable)value;
    }

    @Override
    public Object assemble(Serializable cached, Object owner)
            throws HibernateException {
        return cached;
    }

    @Override
    public Object replace(Object original, Object target, Object owner)
            throws HibernateException {
        // TODO Auto-generated method stub
        return deepCopy(original);
    }

}

并对Entity类进行如下注解:

    @Column(name = "path", nullable = false, columnDefinition = "ltree")
    @Type(type = "LTreeType")
    private String path;

关于java - 在 hibernate 中映射 PostgreSQL LTREE 列时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41287897/

相关文章:

java - 'sort' 属性有什么作用?

java - hibernate 中的 TransientObjectException

java - 如何在 Java Play 中使用 Form 从 JSON 请求中解析 Date 对象

java - 检查对象是否是任何 'number' 类的实例?

SQL/Postgresql 如何对列进行分组,但根据某些条件查找另一列的平均值

postgresql - Redshift : New table but Group members can't query

hibernate - 具有多个数据库供应商支持的 Java/Maven/JPA/Hibernate 构建的最佳方法?

java - 我正在寻找一种使用哈希码进行图像比较的解决方案。我的尝试如下

java - 用于投资组合选择的纯 Java 开源库(= 受约束的非线性优化)?

database - 行锁会影响postgreSQL中的主从吗