首页 > 解决方案 > Spring data jpa:一对一关系

问题描述

我有传感器实体与位置实体有关系

@RequiredArgsConstructor
@Data
public class TemperatureSensor {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private float temperature;
    private float min;
    private float max;
    private float timeInterval;
    private boolean activityState;
    @OneToOne
    private Location location;
}
@Entity
@Data
@RequiredArgsConstructor
public class Location {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private Long coordinates;
    private String name;
    private EnvironmentState environmentState = EnvironmentState.NORMAL_CASE;
    @OneToOne
    private TemperatureSensor temperatureSensor;
}

我创建了两个端点来启动每个实体,因此我像这样使用 Postman 发送 Sensor 对象并在数据库中获取 location_id null。位置也是如此。

    {
    "temperature" : "15.2",
    "min" :"9.0",
    "max" : "20.0", 
    "timeInterval" : "552.5", 
    "activityState" : "true",
    "location_id" :"1"
    }

另外,我尝试发送位置对象,但出现异常:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例

{
    "temperature" : "15.2",
    "min" :"9.0",
    "max" : "20.0", 
    "timeInterval" : "552.5", 
    "activityState" : "true",
    "location" :{"coordinates": "123","name" : "loc01"}
    
}

标签: springspring-bootspring-data-jpaone-to-one

解决方案


问题似乎是您在@OneToOne注释上缺少级联选项。尝试@OneToOne(cascade = CascadeType.ALL)改用(这会将所有操作 PERSIST、MERGE、REMOVE、REFRESH、DETACH 级联到另一个实体)。

@RequiredArgsConstructor
@Data
public class TemperatureSensor {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private float temperature;
    private float min;
    private float max;
    private float timeInterval;
    private boolean activityState;
    @OneToOne(cascade = CascadeType.ALL)
    private Location location;
}
Entity
@Data
@RequiredArgsConstructor
public class Location {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private Long coordinates;
    private String name;
    private EnvironmentState environmentState = EnvironmentState.NORMAL_CASE;
    @OneToOne(cascade = CascadeType.ALL)
    private TemperatureSensor temperatureSensor;
}

推荐阅读