在Hibernate中映射PostgreSQL LTREE列时出错 [英] Getting error when mapping PostgreSQL LTREE column in hibernate
本文介绍了在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屋!
查看全文