Apache Avro и Spring Data? - PullRequest
       7

Apache Avro и Spring Data?

0 голосов
/ 31 января 2020

Я использую apache -avro для определения представлений нашей модели данных, используя java 8 и maven.

У меня есть это определение авро

{"namespace": "com.github.emeraldjava.avro",
"type": "record",
"name": "DBTableName",
"fields": [
    {"name": "aString", "type": ["string","null"]},
    {"name": "aLong", "type": ["long","null"]},
    {"name": "aNullableInt",  "type": ["int", "null"]},
    {"name": "aNullableString", "type": ["string", "null"]},
    {"name": "aIntDate", "type": ["null",{ "type": "int", "logicalType": "date" }]},
    {"name": "aIntTimeMillis", "type": ["null",{ "type": "int", "logicalType": "time-millis" }]},
    {"name": "aLongTimeMicros", "type": ["null",{ "type": "long", "logicalType": "time-micros" }]},
    {"name": "aLongTimeStampMillis", "type": ["null",{ "type": "long", "logicalType": "timestamp-millis" }]},
    {"name": "aLongTimeStampMicros", "type": ["null",{ "type": "long", "logicalType": "timestamp-micros" }]}
]
}

, и я использую плагин maven-avro для генерации класса DBTableName java.

package com.github.emeraldjava.avro;

import org.apache.avro.specific.SpecificData;

@org.apache.avro.specific.AvroGenerated
public class DBTableName extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"DBTableName\",\"namespace\":\"com.github.emeraldjava.avro\",\"fields\":[{\"name\":\"aString\",\"type\":[\"string\",\"null\"]},{\"name\":\"aLong\",\"type\":[\"long\",\"null\"]},{\"name\":\"aNullableInt\",\"type\":[\"int\",\"null\"]},{\"name\":\"aNullableString\",\"type\":[\"string\",\"null\"]},{\"name\":\"aIntDate\",\"type\":[\"null\",{\"type\":\"int\",\"logicalType\":\"date\"}]},{\"name\":\"aIntTimeMillis\",\"type\":[\"null\",{\"type\":\"int\",\"logicalType\":\"time-millis\"}]},{\"name\":\"aLongTimeMicros\",\"type\":[\"null\",{\"type\":\"long\",\"logicalType\":\"time-micros\"}]},{\"name\":\"aLongTimeStampMillis\",\"type\":[\"null\",{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}]},{\"name\":\"aLongTimeStampMicros\",\"type\":[\"null\",{\"type\":\"long\",\"logicalType\":\"timestamp-micros\"}]}]}");
  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
  @Deprecated public java.lang.CharSequence aString;
  @Deprecated public java.lang.Long aLong;
  @Deprecated public java.lang.Integer aNullableInt;
  @Deprecated public java.lang.CharSequence aNullableString;
  @Deprecated public org.joda.time.LocalDate aIntDate;
  @Deprecated public org.joda.time.LocalTime aIntTimeMillis;
  @Deprecated public java.lang.Long aLongTimeMicros;
  @Deprecated public org.joda.time.DateTime aLongTimeStampMillis;
  @Deprecated public java.lang.Long aLongTimeStampMicros;

с этого авро определение фактически отображается непосредственно в таблицу базы данных. Есть ли существующий или простой способ, где я мог бы использовать сгенерированный класс с функциональностью репозитория данных Spring.

public interface DBTableNameRepo extends Repository<DBTableNameType, Long> {
}

Я хотел бы иметь возможность сохранять и читать данные в интерфейсе @Repository, но не уверен, что требуется. Любой совет будет оценен.

1 Ответ

1 голос
/ 31 января 2020

Поскольку этот сгенерированный класс не использует аннотации постоянства (@Table), я бы создал класс, который расширяет DBTableName, а затем использовал бы его как сущность в определениях репозитория, например:

@Entity
@Table(name = "my_table")
public class MyExtendedDBTableNameTypeClass extends DBTableNameType {
    .....
}
public interface DBTableNameRepo extends Repository<MyExtendedDBTableNameTypeClass, Long> {
}

...