2017-12-20 5 views
1

외래 키가없는 데이터베이스에서 엔티티를 만들고 나중에 외래 키를 업데이트하려고합니다.hibernate : 외래 키가없는 엔티티를 저장할 때의 예외

@Entity 
public class Business { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int businessId; 

    @Column 
    private String businessName; 

    @ManyToOne() 
    @JoinColumn(name="billTypeId", nullable=true) 
    @NotFound(action=NotFoundAction.IGNORE) 
    private BillType billType; 

    // getters and setters 
} 

billType 속성은 null 값을 가지고 있는데 다음과 같은 예외가 점점 오전 : 나는 비즈니스 개체를 유지하고 billTypeId 필드에 0의 값을 가질 수있는 방법

Caused by: java.sql.SQLIntegrityConstraintViolationException: (conn:54) 
Column 'billTypeId' cannot be null 
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:152) 
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118) 

의 billType 멤버를 is null

+0

귀하의 코드는 데이터베이스에 의해 시행되는 제약 조건과 모순됩니다. NotFound 주석 (일치하지 않는 데이터베이스를 처리하기위한 해킹)을 제거하고 엔터티를 저장하기 전에 청구서 유형을 설정하기 만하면됩니다. –

+0

데이터베이스에 의해 강제되는 제약 조건이 없습니다. billType을 설정하여 제대로 작동시킬 수 있다는 것을 알고 있습니다. 그러나 먼저 BillType없이 Business 개체를 저장하고 이후 단계에서 설정해야합니다. 내 질문은 어떻게? –

+1

그건 예외가 아니라 SQLIntegrityConstraintViolationException입니다. 당신은 거의 제약이 위반되었다고 생각할 것입니다. – Kayaman

답변

1

일반적으로 접근 방식을 재고하고 데이터베이스에서 billTypeId 열의 null 값을 허용하는 것이 좋습니다. 이는 표준 동작입니다. 또한 0 값은 나중에 지정할 수있는 외래 키 제약 조건으로 참조 된 ID으로 간주됩니다.

여전히 서로 다른 접근 방식을

하나의 옵션을 시도하려는 경우 COMMIT 또는 MANUALAUTO (기본값)에서 플러시 모드를 변경하고 실제로 데이터베이스에 아무것도를 세척하기 전에 전체 개체 트리를 구축하는 것입니다. (AUTOSELECT 전에 세션 변경을 확인하고있을 경우 데이터베이스에 변경 사항을 플러시는.이. 최신 데이터를 읽을뿐만 아니라, 성능을 죽이고되도록)

은 또한 Hibernate는

  • 을 제공합니다 뿐만 아니라 널 (null) 열 값에 대한 INSERT 문을 생성하는 최대 절전 모드를 조언합니다 @DynamicInsert 주석 최대 절전 모드를 조언합니다 (doc)
  • @DynamicUpdate 주석은 UPDATE 문을 생성 할뿐만 아니라 열에있는 값 s 변경됨 (doc)

이 접근법은 극히 세심한주의를 기울여 사용하는 것이 좋습니다.

또는 insertableupdatable attipe가 @JoinColumn annotation (doc) 일 수 있습니다. 링크를 사용하지 않고 레코드를 삽입하고 나중에 수정하여 업데이트하는 경우에는 insertable=false을 사용해야합니다.

+0

덕분에 @DynamicInsert가 내 문제를 실제로 해결했습니다 –

+0

문제를 해결 한 경우 투표를하거나 응답을 수락하십시오. –

+0

나는 대답을 받아 들였지만, 나는이 사이트의 멍청이이기 때문에 아직 투표에 포함되지 않았다. –