[英]convertToDatabaseColumn when data is not being persisted?
我已經實現了AttributeConverter.convertToEntityAttribute方法來從數據庫加載json數據。 我沒有嘗試保留數據,但是由於某種原因,正在調用convertToDatabaseColumn 。
這是發生了什么:
1.我調用存儲庫方法
2.然后對AttributeConverter.convertToEntityAttribute的調用->返回實體Cx的列表 。 至此,一切正常。
3.但是由於某種原因, 緊隨其后調用了AttributeConverter.convertToDatabaseColumn,使用相同的實體Cx列表作為參數->返回stringV
4.現在,再次以stringV作為參數調用convertToEntityAttribute,這也很奇怪。
可能是@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時發生
是的,它的行為確實像您說的那樣。 同樣,在保留RST時,Converter也稱為3x。
僅讀取RS實體時,它也稱為3x,即不是由@OneToOne關系引起的。
我認為這是冬眠的方式。 沒問題,您將獲得正確的數據而不會出錯。
從stacktrace中,我看到第二個和第三個調用來自AbstractRowReader.performTwoPhaseLoad()。
at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.performTwoPhaseLoad(AbstractRowReader.java:241)
at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:209)
at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:133)
我認為這是不能禁用的。 從休眠源中,我看到該實體已注冊為“水合”。 我在這里找到了更多有關它的信息https://stackoverflow.com/a/29538797/2044957
另一件事:僅當在集合上使用轉換器時,才會發生這種情況。 如果Converter用於單一類型,例如AttributeConverter<String, String>
,則調用一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.