Внедренный объект всегда нулевой? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть следующее тело запроса, которое я пытаюсь вставить в базу данных:

{
   "vin": "1HGCR2F3XFA027534",
   "latitude": 41.803194,
   "longitude": -88.144406,
   "timestamp": "2017-05-25T17:31:25.268Z",
   "fuelVolume": 1.5,
   "speed": 85,
   "engineHp": 240,
   "checkEngineLightOn": false,
   "engineCoolantLow": true,
   "cruiseControlOn": true,
   "engineRpm": 6300,

   "tires": {
       "frontLeft": 34,
       "frontRight": 36,
       "rearLeft": 29,
       "rearRight": 34
   }
 }

Я не могу вставить его, поскольку объект Tires всегда отображается как нулевой.Я не думаю, что объект json может отображаться на объект шин.

Вот фрагменты

В контроллере:

@RequestMapping(method = RequestMethod.POST, value = "/readings")
public void readVehicleStatus(@RequestBody VehicleStatus vehicleStatus){
    vehicleStatusService.readVehicleStatus(vehicleStatus);
}

VehicleStatus.java

@Entity
public class VehicleStatus {

    @Id
    private String vin;

    private Double latitude;
    private Double longitude;

    private Double fuelVolume;
    private int speed;
    private int engineHp;
    private int engineRpm;

    private boolean checkEngineLightOn;
    private boolean engineCoolantLow;
    private boolean cruiseControlOn;

    @Embeded
    private Tires tires;

    /* getters and setters created */

}

Tires.java

   @Embeddable
   public class Tires {

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

       private int frontLeft;
       private int frontRight;
       private int rearLeft;
       private int rearRight;

       /* getters and setters included */
    }

1 Ответ

0 голосов
/ 31 декабря 2018

В вашем VehicleStatus свойстве json для шин указано vehicleTire, а в json - tires, поэтому всегда имеет значение null, поэтому вы должны добавить @JsonProperty(value="tires").

Вотполный код:

@Entity
public class VehicleStatus implements Serializable{

    @Id
    private String vin;

    private Double latitude;
    private Double longitude;

    private Double fuelVolume;
    private int speed;
    private int engineHp;
    private int engineRpm;

    private boolean checkEngineLightOn;
    private boolean engineCoolantLow;
    private boolean cruiseControlOn;

    @OneToOne(mappedBy = "vehicleStatus",cascade=CascadeType.ALL)
    @JoinColumn(name = "id")
    @JsonProperty(value="tires") // here is the key :)
    private Tires vehicleTire;

  // Getters && Setters
}

@Entity
public class Tires implements Serializable{

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

    private Integer frontLeft; // NB try always to use wrapper type rather than primitive in jpa
    private Integer frontRight;
    private Integer rearLeft;
    private Integer rearRight;

    @OneToOne
    private VehicleStatus vehicleStatus;

    // Getters && Setters
}

Репозиторий шин:

public interface TiresRepository extends JpaRepository<Tires, Integer>{

}

Репозиторий VehicleStatus:

public interface VehicleStatusRepository extends JpaRepository<VehicleStatus, String>{

}

Пример контроллера:

@RestController
@RequestMapping
class MyController {

    @Autowired
    private VehicleStatusRepository vehicleStatusRepository;

    @RequestMapping(method = RequestMethod.POST, value = "/readings")
    public void readVehicleStatus(@RequestBody VehicleStatus vehicleStatus){
        vehicleStatusRepository.saveAndFlush(vehicleStatus);
    }
}

Основной класс:

@SpringBootApplication
@EnableAutoConfiguration
public class SpringStackOverflowSolutionApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringStackOverflowSolutionApplication.class, args);
    }

}

Примечание: не забудьте cascadeAll, иначе объект шин не будет сохранен в базе данных, и вы получите следующее исключение:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : package.VehicleStatus.vehicleTire -> package.Tires
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...