PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да съпоставите org.postgresql.geometric.PGpoint към Hibernate Type

Първо и най-важно мисля, че GEOMETRY типовете данни се поддържат от Hibernate Spatial , но ако не са, винаги можете да дефинирате персонализиран тип хибернация и персонализиран диалект на хибернация.

Имах подобен проблем, когато управлявах POINT колона, която съдържа географски точки.

Създадох PostgisDialect клас, който разшири PostgreSQL9Dialect , където регистрирате новия тип данни по този начин

public PostgisDialect() {
    registerColumnType(Types.BINARY, "geography");        
}

във вашия случай бихте регистрирали типа като "geometry"

след това дефинирате GeometryType клас, който имплементира UserType

Колкото и да е странно, процесът на писане на персонализиран Hibernate Type не е една от най-документираните функции, така че ще поставя тук това, което написах, за да дефинирам моя PointType. За другите методи в интерфейса им позволявам да хвърлят UnsupportedOperationException

public class PointType implements UserType{
private static final Type[] PROPERTY_TYPES = new Type[] { 
    StringType.INSTANCE };
public String[] getPropertyNames() {
     return new String[] {"point"};   }

public Type[] getPropertyTypes() {
    return PROPERTY_TYPES;
}


public Class returnedClass() {
   return Point.class;
}

public boolean equals(Object o, Object o1) throws HibernateException {
    if((o instanceof Point && o1 instanceof Point) == false)
        return false;
    Point p1 = (Point) o;
    Point p2 = (Point) o1;
    boolean equal = ((p1.getX() == p2.getX()) && (p1.getY() == p2.getY()));
    return equal;


}   

public Object nullSafeGet(ResultSet rs, String[] strings, SessionImplementor si, Object o) throws HibernateException, SQLException {
// the method which gets the data from the column and converts it to a Point using       BinaryParser
   BinaryParser bp = new BinaryParser();       
   try{          
      String binaryString = rs.getString(strings[0]);
       return bp.parse(binaryString);
   }
   catch(Exception ex){ return null;}

}

public void nullSafeSet(PreparedStatement ps, Object o, int i, SessionImplementor si) throws HibernateException, SQLException {
    Point p = (Point) o ;
    if(p!=null){
       BinaryWriter bw = new BinaryWriter();
       ps.setObject(i,bw.writeBinary(p));      
    }

public Object deepCopy(Object o) throws HibernateException {
    Point p = (Point) o;        
    Point newPoint = null;
    if(p!=null){
        newPoint = new Point(p.x, p.y);
        newPoint.setSrid(p.getSrid());
    }
    return newPoint;

}

public boolean isMutable() {
    return true;
}


public int[] sqlTypes() {
    return new int[]{Types.BINARY};
}    

}

някои бързи бележки:nullSafeSet и nullSafeGet записват и четат стойностите съответно към/от базата данни, използвайки обектите BinaryWriter/BinaryParser.

След като сте дефинирали всичко това, ето как анотирате своя моделен клас, така че да използва вашия персонализиран тип

@Column(name="point")
@Type(type="eu.enricorampazzosoluzioni.incidentpredicter.dataCopier.hibernate.types.PointType")
private Point point;

Не на последно място, трябва да кажете на Hibernate да използва вашия персонализиран диалект. Ако използвате Spring, за да дефинирате вашата фабрика за сесии, можете да я дефинирате чрез hibernateProperties

<property name="hibernateProperties">
     <props>           
         <prop key="hibernate.dialect">eu.enricorampazzosoluzioni.incidentpredicter.dataCopier.hibernate.dialect.PostgisDialect</prop>            
     </props>
  </property>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ГРЕШКА в SQL домейна:колоната не съществува, настройка по подразбиране

  2. Създаване на таблица в режим на един потребител в postgres

  3. Преобразувайте шестнадесетичен низ в bigint в Postgres

  4. PostgreSQL комбинации без повторения

  5. Поточно репликация на PostgreSQL срещу логическа репликация