我试图将数据插入到表中,其中一个字段是一个FK到另一个表中。问题是,使用JPA和Criteria来执行操作时,我希望避免填写整个子对象。
例子:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="SENSOR_ID", nullable=false, updatable=false)
private Sensor sensor;

public Sensor getSensor() {
    return sensor;
}

public void setSensor(Sensor sensor) {
    this.sensor = sensor;
}

em.getTransaction().begin();
Measure m = new Measure();

m.setDeformation(measure.getDeformation());
m.setMoment(timestamp);
m.setTemperature(measure.getTemperature());
m.setTension(measure.getTension());
m.setSensorId(measure.getSensorId()); // I would like to do it like this and not having to use m.setSensor();

em.persist(m);

最佳答案

如果传感器以测量方式映射,如您的示例所示:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="SENSOR_ID", nullable=false, updatable=false)
private Sensor sensor;

你需要填充传感器实例。传感器未与度量一起保存,因为默认情况下不级联任何操作。在调用此命令之前必须保存它。
要不填充整个传感器,请使用sensor_id FK而不是Measure类中的传感器。
@Column(nullable = true)
private Long sensor_id;

要同时使用两者,必须为只读:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="SENSOR_ID", updatable=false, insertable = false)
private Sensor sensor;

10-07 19:05