Пользовательский базовый тип Hibernate с функцией базы данных - PullRequest
5 голосов
/ 25 мая 2019

Я создаю пользовательский тип Hibernate, используя AbstractSingleColumnStandardBasicType для автоматического преобразования SQL UDT в тип Java.SQL использует функции базы данных для создания и сериализации данных столбца из BLOB и / или CLOB, и я хочу скрыть это от пользователя.Таким образом, они не должны использовать @ColumnTransformer(read="_serializer(column_name)", write="_constructor(?)") для каждого столбца.

Я создал типы, используя BLOB SqlTypeDescriptor и пользовательский JavaTypeDescriptor для преобразования на уровне JDBC, но как мне сделать так, чтобы мой пользовательский тип переносил столбец и параметры в соответствующие функции SQL?Я не нахожу ничего описывающего что-то подобное.

Редактировать: Чтобы сделать это более конкретным, этот UDT (SDE ST_GEOMETRY) должен быть построен с помощью функций базы данных (ST_LineFromText) или определенного конструктора UDT(ST_LineString).Аналогично, чтобы прочитать их из базы данных, вы должны «экспортировать» их в определенный формат (ST_AsText), чтобы Java могла их прочитать.Обычный подход чтения полей типа не работает в этом случае.

Итак:

create table geo_lines (
  line SDE.ST_GEOMETRY
);

И:

@Entity
@Table(name="geo_lines")
public class GeoLine {
  @Column(name="line")
  @Type(type="org.example.MyStLineType")
  // i'm wanting to be able to omit the following annotation
  @ColumnTransformer(read="SDE.ST_AsText(line)", 
         write="SDE.ST_ST_LineFromText(?, 3857)")
  private Polyline line;
}

Итак, все моиТипу действительно нужно от пользователя число (3857 в данном случае), которое можно передать в качестве параметра, а все остальное является стандартным шаблоном для любой строки.Повторите эти действия для других типов, таких как точки, полигоны и т. Д.

...