'not-null property references a null or transient value' 에러 해결과정

이주인·2022년 12월 26일
0

스프링 공부

목록 보기
4/11

문제 기술

코드로 배우는 스프링부트 439p,
스프링 jpa data를 사용한 db에 데이터를 삽입하는 실습중

'not-null property references a null or transient value'
에러 발생

문제가 되는 코드는 다음과 같다

  • 엔티티 코드
package org.zerock.b01.domain;

import lombok.*;

import javax.persistence.*;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Board extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bno;

    //컬럼의 길이는 500,  null 허용여부
    @Column(length = 500, nullable = false)
    private String title;

    @Column(length = 2000, nullable = false)
    private String content;

    @Column(length = 50, nullable = false)
    private String writer;
}
  • 테스트 코드
@Test
    public void testInsert(){
        IntStream.rangeClosed(1, 100).forEach(i->{
            Board board = Board.builder()
                    .title("title...." + 1)
                    
                    .writer("user" + (i % 10))
                    .build();

            Board result = boardRepository.save(board);
            log.info("BNO: " + result.getBno());

        });
    }

에러메시지 분석

not-null property references a null or transient value 에러의 경우

  • nullable = false 로 표시된 열에 대해 null 값을 저장할 때
  • 저장되지 않은 인스턴스를 참조하는 연관이 있는 엔티티를 저장할 때

문제가 발생한다고 한다

에러를 수정하기 위한 활동

  1. db 변경

마리아db에서 그마나 잘아는 mysql로 변경후 다시 테스트

  1. 코드 재확인

코드를 확인해본 결과, 테스트 코드에서 문제가 발견되었다.

content 컬럼에 값을 넣는 코드를 빼먹었다....

수정결과

@Test
    public void testInsert(){
        IntStream.rangeClosed(1, 100).forEach(i->{
            Board board = Board.builder()
                    .title("title...." + 1)
                    .content("content..." + i)
                    .writer("user" + (i % 10))
                    .build();

            Board result = boardRepository.save(board);
            log.info("BNO: " + result.getBno());

        });
    }

잘 동작한다.

참고한 사이트

https://www.baeldung.com/hibernate-not-null-error

이거 읽어보다가 테스트 코드를 확인안해봤다는 것을 알고 다시 확인하니 문제를 찾을 수 있었다.

테스트 코드를 테스트하는 코드가 필요한 듯.

profile
소프트웨어공

0개의 댓글