2017-04-22 10 views
0

テーブルにデータを挿入しようとしていて、フィールドの1つが別のテーブルへの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の代わりにsensor_id FKを使用します。

@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]フィールドに複数の書き込み可能なマッピングが存在します。書き込み可能と定義できるのは1つだけです。他はすべて読み取り専用に指定する必要があります。 – wdoering

+0

sensor_idカラムでこれを提案しますか? @ManyToOne \t @JoinColumn(名= "SENSOR_ID"、= =偽、挿入、更新可能、FALSE FALSE = NULL可能) \tプライベートセンサーセンサ(= FetchType.LAZYフェッチ)。 \t @Column(nullable = true) \t private整数sensor_id; – wdoering

+0

@それはそうです。 –

関連する問題