2016-09-05 3 views
0

내가 여기 내 모델입니다 elcipselink은 EclipseLink의 manytoone는

와 persit 문제가 저장할 수 없습니다.

그럼 내가 수행 할 때 내가 쓰기 위해 일괄 삽입을 사용하고 있습니다

@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) 

매핑에 뭔가가 빠졌습니까?

내가 stoppoint 법인이 같은 것을 추가해야합니까 :

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

나는 그것이 널 때문에 그 내 EmbeddedId에 의한 생각

EDIT1 @! 매핑 doesn''t embedable 개체에서 올바른 값을 설정?

@Embeddable 
public class AssocLangueCodeBeGareFK implements Serializable { 

private String id_langue; 
private Long id_gare; 

@Override 
public int hashCode() { 

덕분에 많은 :

여기 embedable 객체입니다!

+0

insertable = false 및 updatable = false는 매핑의 값이 데이터베이스에 기록되지 않도록합니다. 데이터베이스 열에 다른 매핑이있어 값을 설정하고 있거나 설정되지 않기를 바랍니다. – Chris

답변

0

마침내 내가 해결책 찾기 :

내가 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 주석은 embeddable ID의 값을 설정합니다. 또는 참조 된 클래스의 값을 적절한 AssocLangueCodeBeGare.key 필드에 수동으로 추가 할 수 있습니다.

+0

네, 그게 왜 @ idclass를 사용하여 복합 키를 유지하고 이제는 모두 잘 작동합니다. –

+0

ID 필드가 값으로 삽입되는 것을 방지하는 insertable = false를 보여주기 때문에 퍼시스턴스 유닛을 배포 할 때 오류 또는 경고가 표시되지 않는다는 것에 놀라움을 금치 못합니다. 내 대답은 귀하의 문제가 귀하의 원래 접근법에 있지만, 당신이 데이터베이스 필드를 제어하는 ​​데 사용하려는 매핑에 삽입 = false를 사용하여 설명하려고 시도했다. – Chris

+0

죄송합니다, 당신 말이 맞습니다;) 그것은 나쁜 복사/붙여 넣기입니다 :(나는 내 대답에서 그들을 제거;) –