当前位置: 首页 > 知识库问答 >
问题:

使用复合键保存实体get ConversionNotSupportedException

鄢禄
2023-03-14

我使用spring boot 2,我的一些实体有复合键

当我尝试保存一个实体时,我会得到这个错误

无法转换请求元素:org.springframework.beans.conversionNotSupportedException:无法将类型“java.lang.integer”的属性值转换为属性“samping”所需的类型“com.lcm.model.samplingspk”;嵌套异常为java.lang.IllegalStateException:无法将“java.lang.Integer”类型的值转换为属性“sampling”所需的类型“com.lcm.model.samplingspk”:未找到匹配的编辑器或转换策略

我用那个方法得到我的实体

public Samples findById(Integer id, int year, String sampleLetter) {
    Optional<Samples> optSamples = samplesRepository.findById(new SamplesPK(new SamplingsPK(year, id), sampleLetter));

    if (optSamples.isPresent()) {
        return optSamples.get();
    }

    return null;
}


Samples samples = samplesService.findById(idSeq, year, samplesLetter);

Compressions compressionTest = null;

if (samples.getTestSamples().getAbsorptionTest() != null) {
    compressionTest = samples.getTestSamples().getCompressionTest();
} else {
    compressionTest = new Compressions();
}

samplesService.save(samples);

我的实体

@Entity
@IdClass(SamplesPK.class)
public class Samples extends BaseEntity{
    @Id
    private String sampleLetter;

    @Embedded
    private TestSamples testSamples;

    @Id
    @ManyToOne(optional=false)
    @JoinColumns({
        @JoinColumn(name = "sampling_id", referencedColumnName = "id"),
        @JoinColumn(name = "sampling_year", referencedColumnName = "year")})
    private Samplings sampling;
}

@Entity
@IdClass(SamplingsPK.class)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Samplings {
    @Id
    private Integer year;

    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy = "sampling", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Samples> samples = new ArrayList<>();
}

public class SamplingsPK implements Serializable {

    private int year;

    private Integer id;

    public SamplingsPK(int year, Integer id) {
        this.id = id;
        this.year = year;
    }
}

public class SamplesPK implements Serializable {

    private SamplingsPK sampling;

    private String sampleLetter;

    public SamplesPK(SamplingsPK sampling, String sampleLetter) {
        this.sampling = sampling;
        this.sampleLetter = sampleLetter;
    }
}

编辑

没有问题保存样本,当我通过取样

共有1个答案

桂高昂
2023-03-14

这个问题在https://jira.spring.io/browse/datajpa-1391中跟踪,它与samples中的@id@manytoOne的使用有关。作为一种解决办法,您可以尝试为samplings创建一个包含两个主键的构造函数,或者一个包含java.lang.integer的构造函数?这对单一级别的复合主键是有效的,但如果有多个级别,则可能不起作用。

您还将samplingspk中的year键入为int而不是integer。这可能会导致PK识别的问题,因为需要特别考虑处理AutoBox的原始类,我怀疑这是考虑过的。

 类似资料:
  • 我有以下实体: 我第一次使用复合主键,所以我不知道它应该如何工作。问题可能来自定义。第二个参数应该表示ID。但是没有一个主键,而是有两个主键,所以我认为我应该将id类添加到id参数中,但这不起作用。如何使用带有CrudRepository的IdClass键保存具有复合主实体?

  • 我有以下100万个实体的关系,指导学生。mentor有复合主键,我在student中使用它作为外键 然后,我将上面的内容保持为下面的内容,但在student表为空的地方,只有mentor被保持。 我如何坚持与学生的导师?

  • 异常[EclipseLink-48](Eclipse Persistence Services-2.3.2.v20111125-r10461):org.Eclipse.Persistence.exceptions.Description异常描述:字段[flight.connid]存在多个可写映射。只有一个可以定义为可写,所有其他的都必须指定为只读。映射:org.eclipse.persistenc

  • 问题内容: 如果我有两个像这样的hibernate实体: 我有一个已经存储的公司 我可以创建一个仅用其ID引用公司的人,而不是加载整个记录,例如: 它是仅保存参考还是使用更新公司? 问题答案: 是的,您可以做到。 它是否仅保存引用,还是使用name = null更新公司? 使用default ,这样,Hibernate将不执行任何操作。因此答案是:它只保存一个外键。 最有效的方法(也适用于JPA)

  • 我有两个具有@ManyToOne关系的实体类,如下所示。 我是Spring Data JPA的新手,所以这可能是一个非常基本的错误。

  • 我在使用复合主键创建实体时遇到问题,该键也是外键。这是我的表和关系表原理图。当我想创建新闻实体时,我收到了带有null creatingnews的错误消息。新闻翻译有复合主键,外键引用到新闻表。 这是我的代码: 新闻聚合 新闻翻译 标签 新闻语言ID 在NewsFactory中,我希望使用NewsTranslation创建NewsAggregate,但有错误消息NullPointer。 新闻工厂