PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

org.postgresql.geometric.PGpoint को हाइबरनेट प्रकार में कैसे मैप करें

सबसे पहले और सबसे महत्वपूर्ण, मुझे लगता है GEOMETRY डेटा प्रकार हाइबरनेट स्थानिक द्वारा समर्थित हैं , लेकिन यदि वे नहीं हैं, तो आप हमेशा एक कस्टम हाइबरनेट प्रकार और एक कस्टम हाइबरनेट बोली परिभाषित कर सकते हैं।

POINT . को प्रबंधित करते समय मुझे भी इसी तरह की समस्या हुई थी कॉलम जिसमें भूगोल के बिंदु थे।

मैंने एक PostgisDialect created बनाया है क्लास जिसने PostgreSQL9Dialect extended को बढ़ाया है , जहां आप इस तरह से नया डेटा प्रकार पंजीकृत करते हैं

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

आपके मामले में, आप इस प्रकार को "ज्यामिति" के रूप में पंजीकृत करेंगे

फिर, आप एक GeometryType परिभाषित करते हैं वह वर्ग जो UserType . को लागू करता है

अजीब तरह से, एक कस्टम हाइबरनेट प्रकार लिखने की प्रक्रिया सबसे अधिक प्रलेखित विशेषताओं में से एक नहीं है, इसलिए मैं अपने पॉइंट टाइप को परिभाषित करने के लिए जो लिखा है उसे यहां पेस्ट करूंगा। इंटरफ़ेस में अन्य विधियों के लिए, मैंने उन्हें UnsupportedOperationException throw फेंकने दिया

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, बाइनरीवाइटर/बाइनरीपार्सर ऑब्जेक्ट्स का उपयोग करके क्रमशः डेटाबेस से/में मानों को लिखते और पढ़ते हैं।

एक बार जब आप यह सब परिभाषित कर लेते हैं, तो आप अपने मॉडल वर्ग को इस तरह से एनोटेट करते हैं ताकि वह आपके कस्टम प्रकार का उपयोग करे

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

अंतिम, लेकिन कम से कम, आपको अपनी कस्टम बोली का उपयोग करने के लिए हाइबरनेट को बताना होगा। यदि आप अपने सत्र कारखाने को परिभाषित करने के लिए स्प्रिंग का उपयोग करते हैं, तो आप इसे 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. PostgreSQL में नेक्स्टवल को विश्व स्तर पर कैसे परिभाषित करें?

  2. पोस्टग्रेज एनओएसक्यूएल जेसन डेटा में जेसन सरणी का कुल योग प्राप्त करें

  3. PostgreSQL में ओवरलैपिंग तिथियों के लिए परीक्षण कैसे करें

  4. Heroku Postgres त्रुटि - ऑपरेटर टाइमज़ोन =पूर्णांक के बिना टाइमस्टैम्प मौजूद नहीं है

  5. Django डेटाबेस नहीं छोड़ सकता:psycopg2.OperationalError:वर्तमान में खुले डेटाबेस को नहीं छोड़ सकता