2016-09-05 6 views
0

は、私がここで私のモデルであるelcipselinkのEclipseLink manytooneは

とpersitの問題を持って保存していません。

その後、私が行うときに:私は書き込みのために、バッチ挿入を使用して、mは

@Override 
public void save(T entityToSave) { 
    this.getEntityManager().persist(entityToSave); 
} 

ある

this.serviceStopPoint.save(currentStopPoint); 
      for (AssocLangueCodeBeGare assoc : listAssocLangueCodeBeGare) { 
       assoc.setStopPoint(currentStopPoint); 
       this.serviceAssocLangueCodeBeGare.save(assoc); 
      } 

保存時々私は別のエンティティのフラッシュが行われ、私が手に保存するとき:

Caused by: org.h2.jdbc.JdbcBatchUpdateException: NULL not allowed for column "ID_GARE"; SQL statement: 
INSERT INTO TBL_ASSOC_LANGUE_CODE_BE_GARE (CODE_BE, ID_GARE, ID_LANGUE) VALUES (?, ?, ?) [23502-192] 
at org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1208) 
at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.executeBatch(DatabasePlatform.java:2134) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeJDK12BatchStatement(DatabaseAccessor.java:871) 

マッピングで何か不足していますか?

iはstoppointエンティティにこのような何かを追加する必要がない:EDIT1

@

@OneToMany(mappedBy = "stopPoint", cascade = CascadeType.ALL) 
List<AssocLangueCodeBeGare> assocLangueCodeBeGares; 

私はそれがNULLであったため、その私のEmbeddedIdによって引き起こされると思います!!マッピングは埋め込み可能なオブジェクトに正しい値を設定しませんか?ここ

はembedableオブジェクトです:

@Embeddable 
public class AssocLangueCodeBeGareFK implements Serializable { 

private String id_langue; 
private Long id_gare; 

@Override 
public int hashCode() { 

おかげでたくさん!

+0

insertable = falseおよびupdatable = falseは、マッピングの値がデータベースに書き込まれないようにします。うまくいけば、そのデータベース列に別のマッピングがあり、値を設定しているか、設定されていないことを願っています。 – Chris

答えて

0

Finaly私は解決策を見つける:私はAssocLangueCodeBeGare

@IdClass(AssocLangueCodeBeGareFK.classを使用

と私は私が同じになるように私の財産の私のAssocLangueCodeBeGareFKクラス名に名前を変更

@Id 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(nullable = false, name = "ID_GARE", referencedColumnName = "ID_GARE") 
private StopPoint stopPoint; 

@Id 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ID_LANGUE", referencedColumnName = "ID_LANGUE") 
private Langue langue; 

に@Id置きますAssocLangueCodeBeGareクラス:

private Long stopPoint; 
private String langue; 

は今すべて魅力的に機能します。

それは場合に役立ちます...

0

偽偽=更新可能に挿入=は、データベースに書き込まれるのマッピングから値を防ぎます。そのデータベース列に値を設定して別のマッピングを行う必要があります。そうしないと、データベースに入りません。 OneToManyを作成するとIDが機能しますが、JPAのように現在のコードのMapsId注釈も埋め込み可能IDの値を設定します。または、参照されるクラスの値を適切なAssocLangueCodeBeGare.keyフィールドに手動で追加することもできます。

+0

はい、なぜ私は@idclassを使用してコンポジットキーを保持し、すべて正常に動作しています。 –

+0

IDフィールドが値で挿入されないようにする答えがinsertable = falseを示しているので、パーシスタンスユニットを配備するときにエラーや警告が表示されないのは驚きです。私の答えはあなたの問題をあなたの元のアプローチではなく、データベースフィールドを制御するために使用したいマッピングにinsertable = falseを使用して説明しようとしていました。 – Chris

+0

申し訳ありませんが、あなたは正しいです;)それは悪いコピー/ペーストです:(私は私の答えで削除します;) –