Java 数据未被持久化时convertToDatabaseColumn?
我已经实现了AttributeConverter.convertToEntityAttribute方法来从数据库加载json数据。我不想持久化数据,但出于某种原因,正在调用convertToDatabaseColumn。 情况就是这样: 1.我称之为存储库方法 2.然后调用AttributeConverter.convertToEntityAttribute->返回实体Cx的列表。到目前为止,一切正常。 3.但由于某些原因,AttributeConverter.convertToDatabaseColumn在后面被调用,其实体Cx列表与参数->返回的stringV相同 4.现在再次调用convertToEntityAttribute,并使用stringV作为参数,这也很奇怪 是否是@OneToOne关系导致了这种情况?如果我没有持久化实体(至少是显式持久化),为什么要执行convertToDatabaseColumn 所有这些都是通过在我的一个存储库类中调用单个方法实现的: 这是密码Java 数据未被持久化时convertToDatabaseColumn?,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我已经实现了AttributeConverter.convertToEntityAttribute方法来从数据库加载json数据。我不想持久化数据,但出于某种原因,正在调用convertToDatabaseColumn。 情况就是这样: 1.我称之为存储库方法 2.然后调用AttributeConverter.convertToEntityAttribute->返回实体Cx的列表。到目前为止,一切正常。 3.但由于某些原因,AttributeConverter.convertToDatabase
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时,转换器也称为3x 仅读取RS实体时也称为3x,即它不是由@OneToOne关系引起的 我想这就是hibernate的工作原理。这应该不是一个问题,您可以毫无错误地获得正确的数据 从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)
我认为它是不能被禁用的。从hibernate源代码中,我看到该实体已注册为水合。我在这里找到了更多关于它的信息
另一件事:只有在集合上使用转换器时才会发生这种情况。如果转换器用于单个类型,则只调用一次,例如AttributeConverter。添加实体、转换器和usageI的代码添加了一些代码。。。希望能有帮助。