gpt4 book ai didi

java - 当数据没有被持久化时convertToDatabaseColumn?

转载 作者:行者123 更新时间:2023-12-02 10:08:22 24 4
gpt4 key购买 nike

我已经实现了方法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 关系引起的。

我认为这就是 hibernate 的工作原理。这应该不是问题,您会得到正确的数据,不会出现错误。

从堆栈跟踪中我看到第二个和第三个调用来自 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)

我认为它是无法禁用的。从 hibernate 源中我看到该实体已注册为“保湿”。我在这里找到了更多相关信息 https://stackoverflow.com/a/29538797/2044957

另一件事:只有在集合上使用转换器时才会发生这种情况。如果转换器用于单一类型,则调用一次,例如 AttributeConverter<String, String> .

关于java - 当数据没有被持久化时convertToDatabaseColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55172785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com