与JPA插入记录有一个字段作为外键到另一个表

问题描述:

我想插入数据到一个表中,其中一个字段是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()'提供代码和测量 –

如果传感器在测量你的榜样映射,如:

@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是的,就是这样。 –