何よりもまず、GEOMETRY
だと思います データ型は、 HibernateSpatial
でサポートされています。 、ただしそうでない場合は、カスタムのHibernateタイプとカスタムのHibernate方言をいつでも定義できます。
POINT
を管理するときに同様の問題が発生しました 地理ポイントを含む列。
PostgisDialect
を作成しました PostgreSQL9Dialect
を拡張したクラス 、この方法で新しいデータ型を登録します
public PostgisDialect() {
registerColumnType(Types.BINARY, "geography");
}
あなたの場合、タイプを「ジオメトリ」として登録します
次に、GeometryType
を定義します UserType
を実装するクラス
奇妙なことに、カスタムHibernate Typeを作成するプロセスは、最も文書化された機能の1つではないため、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>