在Hibernate中映射PostgreSQL LTREE列时出错 [英] Getting error when mapping PostgreSQL LTREE column in hibernate

查看:122
本文介绍了在Hibernate中映射PostgreSQL LTREE列时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

实体:

 私人字符串路径; 

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

表格结构

  CREATE TABLE关系(
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

错误:

 在table [relationship]的column [org_path]中遇到错误的列类型;找到[schemaName。ltree(Types#OTHER)],但期待[ltree(Types#VARCHAR)] 

任何人都可以帮助解决这个问题吗?

解决方案

在Java中实现一个自定义的LTreeType类如下: / p>

  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)
抛出HibernateException,SQLException {
return rs.getString(names [0]);

$ b @Override
public void nullSafeSet(PreparedStatement st,Object value,int index)
抛出HibernateException,SQLException {
st.setObject(index ,值,Types.OTHER);

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

@Override
public boolean isMutable(){
return false;

$ b @Override
public可串行化反汇编(Object value)抛出HibernateException {
return(Serializable)value;
}

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

$ b @覆盖
公共对象替换(Object original,Object target,Object owner)
抛出HibernateException {
// TODO自动生成的方法存根
返回deepCopy(original);
}

}

注释Entity类如下:

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


I am trying to map postgresql ltree column in hibernate as follows:

In entity :

private String path;

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

Table structure:

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
)

Getting the following error:

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

Can anyone help how to resolve this issue?

解决方案

Implement a custom LTreeType class in Java as follows:

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

}

And annotate the Entity class as follows:

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

这篇关于在Hibernate中映射PostgreSQL LTREE列时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆