2017-04-22 51 views
0

我想插入數據到一個表中,其中一個字段是FK到不同的表。問題是使用JPA和Criteria來執行操作,我想避免必須填寫整個子對象才能這樣做。 例子:與JPA插入記錄有一個字段作爲外鍵到另一個表

@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); 
+0

爲'm.setSensorId()'提供代碼和測量 –

回答

1

如果傳感器在測量你的榜樣映射,如:

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

您需要填寫傳感器實例。傳感器沒有保存測量值,因爲默認情況下沒有操作級聯。在調用之前必須保存它。

爲了不填滿整個傳感器,請在Measure類中使用sensor_id FK而不是Sensor。

@Column(nullable = true) 
private Long sensor_id; 

同時使用一個必須爲只讀:

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

類你究竟是如何實現的方法setSensorId()? 另外,當我試圖讀取表時,我得到了這個: 異常說明:字段[MEASURE.SENSOR_ID]存在多個可寫映射。只有一個可以被定義爲可寫,所有其他都必須被指定爲只讀。 – wdoering

+0

這是你建議我用sensor_id列做什麼? @ManyToOne(取= FetchType.LAZY) \t @JoinColumn(名稱= 「SENSOR_ID」,可爲空=假,可更新=假,插入= FALSE) \t私人傳感器傳感器; \t @Column(nullable = true) \t private Integer sensor_id; – wdoering

+0

@ wdoering是的,就是這樣。 –

相關問題