Как сопоставить Список <String>с Hibernate / JPA БЕЗ дополнительной таблицы соединения? - PullRequest
0 голосов
/ 01 ноября 2018

Вопрос, который я задаю, довольно прост, но, по-видимому, невозможно найти ответ. Я использую Spring Data JPA, и у меня есть JDBC / JPA DataSource (который является PostgreSQL, но это не должно иметь значения), который предварительно загружен данными, и я просто пытаюсь читать из него.

Как мне построить мой POJO, чтобы у меня могло быть поле List<String>, которое не требует дополнительной таблицы соединений? Вот пример класса сущности, который у меня есть:

@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
  @Id
  @Column(name = "id", columnDefinition = "uuid")
  private String id;

  @Column(name = "a_string", columnDefinition = "text")
  private String aString;

  @Column(name = "strings", columnDefinition = "text[]")
  @ElementCollection
  private List<String> strings;

  // getters/setters
}

При этом я получаю org.postgresql.util.PSQLException: ERROR: relation "pojo_strings" does not exist.

Почему hibernate считает, что нужные мне String находятся в другой таблице? Как мне исправить это поведение? Я просто пытаюсь отобразить столбец PostgreSQL text[] обратно в List<String> в POJO через JPA.

1 Ответ

0 голосов
/ 01 ноября 2018

Подход в этих случаях заключается в использовании jpa AttributeConverter следующим образом:

@Converter
public class StringToListConverter implements AttributeConverter<List<String>, String> {

  @Override
  public String convertToDatabaseColumn(List<String> list) {
    return String.join(",", list); 
  }

  @Override
  public List<String> convertToEntityAttribute(String joined) {
    return new ArrayList<>(Arrays.asList(joined.split(",")));
  }

}

И используйте аннотацию Converter в поле вашей сущности:

@Entity
@Table(name = "pojo", schema = "pojoschema")
public class POJO {
  @Id
  @Column(name = "id", columnDefinition = "uuid")
  private String id;

  @Column(name = "a_string", columnDefinition = "text")
  private String aString;

  @Column(name = "strings")
  @Convert(converter = StringToListConverter.class)
  private List<String> strings;

  // getters/setters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...