PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zmapować org.postgresql.geometric.PGpoint na typ hibernacji?

Przede wszystkim myślę, że GEOMETRY typy danych są obsługiwane przez Hibernate Spatial , ale jeśli tak nie jest, zawsze możesz zdefiniować niestandardowy typ hibernacji i niestandardowy dialekt hibernacji.

Miałem podobny problem podczas zarządzania POINT kolumna zawierająca punkty geograficzne.

Utworzyłem PostgisDialect klasa, która rozszerzyła PostgreSQL9Dialect , gdzie w ten sposób rejestrujesz nowy typ danych

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

w twoim przypadku zarejestrowałbyś typ jako „geometria”

następnie definiujesz GeometryType klasa, która implementuje UserType

Co dziwne, proces pisania niestandardowego typu hibernacji nie jest jedną z najlepiej udokumentowanych funkcji, więc wkleję tutaj to, co napisałem, aby zdefiniować mój typ PointType. W przypadku innych metod w interfejsie pozwalam im rzucić 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};
}    

}

kilka szybkich uwag:nullSafeSet i nullSafeGet zapisuje i odczytuje wartości odpowiednio do/z bazy danych przy użyciu obiektów BinaryWriter/BinaryParser.

Po zdefiniowaniu tego wszystkiego w ten sposób możesz opisać klasę modelu, aby używała Twojego niestandardowego typu

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

Na koniec musisz powiedzieć Hibernate, aby używał niestandardowego dialektu. Jeśli używasz Springa do zdefiniowania swojej fabryki sesji, możesz ją zdefiniować za pomocą 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. Funkcja SQL z parametrami, które mogą mieć wartość NULL

  2. PostgreSQL:jak zainstalować rozszerzenie plpythonu

  3. Dołączyć nazwę tabeli do każdej kolumny w zestawie wyników w SQL? (w szczególności Postgres)

  4. Tworzenie konfiguracji replikacji PostgreSQL na Debianie / Ubuntu

  5. Dodaj sekundy do znacznika czasu