Я реализовал метод AttributeConverter.convertToEntityAttribute для загрузки данных JSON из БД. Я не пытаюсь сохранить данные, но по какой-то причине вызывается convertToDatabaseColumn .
Вот что происходит:
1. Я вызываю метод репозитория
2. затем следует вызов AttributeConverter.convertToEntityAttribute -> возвращает список сущностей Cx . До этого момента все нормально.
3. Но по какой-то причине AttributeConverter.convertToDatabaseColumn вызывается сразу после того, как тот же список сущности Cx в качестве аргумента -> возвращает stringV
4. Теперь атрибут convertToEntityAttribute вызывается снова с stringV в качестве аргумента, что также странно.
Может быть, это связано с отношением @OneToOne? Почему это выполняет convertToDatabaseColumn, если я не сохраняю сущность, по крайней мере, явно?
Все это происходит просто путем вызова одного метода в одном из моих классов репозитория:
Вот код
public interface RSTRepository extends CrudRepository<RST, Long> {
List<RST> findByDuctNameIgnoreCase(String ductName);
}
@Entity
@Table(name="r_s_t")
public class RST {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "r_s_id")
private Rs rs;
@Column(name = "channel")
private String channelName;
...
}
@Entity
@Table(name="r_s")
public class RS {
@Id
@Column(name = "rs_id", columnDefinition = "json")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name = "c_x", columnDefinition = "json")
@Convert(converter = JsonToCxConverter.class)
private List<Cx> cxs;
...
}
public class Cx {
private Long someId;
private List<Long> values;
...
}
@Converter
public class JsonToCxConverterimplements AttributeConverter<List<Cx>, String>{
//this gets executed
@Override
public String convertToDatabaseColumn(List<Cx> entityAttribute) {
ObjectMapper objectMapper = new ObjectMapper();
log.info("--------------------");
return "";
}
@Override
public List<Cs> convertToEntityAttribute(String dbData) {
if (dbData == null || dbData.isEmpty()) return Collections.emptyList();
//... uses the object mapper to parse the json and return a simple object.
...
* *} Тысяча двадцать-один
Как я уже сказал, это происходит при вызове RSTRepository.findByDuctNameIgnoreCase