簡體   English   中英

當數據不持久化時,convertToDatabaseColumn?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM