【问题标题】:How to create composite primary key in Spring, Jpa, Hibernate where one of the composite key is foreign key of another table with many to one join?如何在 Spring、Jpa、Hibernate 中创建复合主键,其中一个复合键是另一个具有多对一连接的表的外键?
【发布时间】:2021-09-01 13:16:51
【问题描述】:

我有两张桌子。为简单起见,这里是the schema。 如您所见,表 sensor_data 有两个复合键,其中一个是元数据 id 的外键。 sensor_data 和 metadata 之间存在多对一的关系,这意味着对于每个元数据,可以有多个 sensor_data,但对于每个 sensor_data,只能有一个元数据。我还是 JPA 和 Hibernate 的新手,所以我正在努力实现它。到目前为止,这是我的代码,

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@IdClass(SensorDataId.class)
public class SensorData {
    
    private Double x;
    private Double y;
    private Double z;

    @Id
    private Long timestamp;
    @Id
    @ManyToOne
    @JoinColumn(name="metadata_id", nullable=false)
    private Metadata metadata;
}



import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class SensorDataId implements Serializable {
    private Long timestamp;
    private Metadata metadata;
}



import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.List;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Metadata{


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String dataObservationRound;
    private Long sensorNr;

    @OneToMany (mappedBy = "metadata")
    private List<SensorData> sensorDataList;

    public Metadata(String dataObservationRound, Long sensorNr) {
        this.dataObservationRound = dataObservationRound;
        this.sensorNr = sensorNr;
    }
}

但是我收到以下异常。

Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.Long' to required type 'com.packagename.model.Metadata' for property 'metadata'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.Long' to required type 'com.packagename.model.Metadata' for property 'metadata': no matching editors or conversion strategy found

由于我的知识非常有限,所以我只是尝试将它们的单独教程联系在一起,但我没有找到任何涵盖此特定场景的教程。因此,我们将不胜感激任何帮助。

【问题讨论】:

    标签: spring-boot hibernate spring-data-jpa many-to-one composite-primary-key


    【解决方案1】:

    我必须在 SensorDataId 中将元数据变量的类型更改为 Long,现在它可以工作了。

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class SensorDataId implements Serializable {
        private Long timestamp;
        private Long metadata;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2018-02-02
      • 2018-10-05
      • 2016-09-18
      相关资源
      最近更新 更多