Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据未被持久化时convertToDatabaseColumn?_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 数据未被持久化时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

我已经实现了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时会发生这种情况

是的,它的行为就像您所说的那样。另外,当保持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的代码添加了一些代码。。。希望能有帮助。