복붙노트

[SPRING] 봄 부팅에 TransientPropertyValueException

SPRING

봄 부팅에 TransientPropertyValueException

나는 LoginCredential 클래스가 있습니다 :

@Data
@Entity
public class LoginCredential implements Serializable {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   Long userID;
   String eMail;
   String passwordHash;
   @GeneratedValue(strategy = GenerationType.AUTO)
   @OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY)
   User user;
}

그리고 여기 내 사용자 클래스입니다 :

@Data
@Entity
public class User {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   Long userID;
   @OneToOne(fetch = FetchType.LAZY,targetEntity = LoginCredential.class)
   @JoinColumn(name = "userID",referencedColumnName = "userID")
   private LoginCredential loginCredential;
}

그리고 내 LoginCredentialController의 POST-ING 방법은 간단하다 :

@PostMapping("/login")
LoginCredential newLoginCredential(@RequestBody LoginCredential newLoginCredential) {
    logger.debug(newLoginCredential);
    LoginCredential a=repository.save(newLoginCredential);
    logger.debug(a);
    return a;
}

지금은이 명령을 시도 할 때 : -X POST 컬 -H "콘텐츠 형식 : 응용 프로그램 / JSON"-d "{\"이메일 \ "\"1 \ "}": // localhost를 : 8080 / 로그인 HTTP를

나는, 오류없이 LoginCredential을 얻을 언급되는 사용자 필드는 null입니다.

-d :이 명령 컬 -X POST -H "응용 프로그램 / JSON 콘텐츠 형식"시도 이유입니다 "{\"이메일 \ 1 \ "\"를 ", \"사용자 \ ": {}}에"http : / / 로컬 호스트 : 8080 / 로그인

어느 날 오류 속담을 제공합니다 :

Application.properties

pom.hml

해결법

  1. ==============================

    1.세 가지 문제가

    세 가지 문제가

    아래로 엔티티를 변경해야하는 모든 문제를 해결하려면 (나는 또한 어떤 쓸모 주석과 값을 제거)

    @Data
    @Entity
    public class User {
    
        @Id
        Long userID;
    
        @JsonBackReference
        @MapsId
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "userID", referencedColumnName = "userID")
        @ToString.Exclude
        private LoginCredential loginCredential;
    }
    

    @Data
    @Entity
    public class LoginCredential {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        Long userID;
        String eMail;
        String passwordHash;
    
        @JsonManagedReference
        @OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
        private User user;
    }
    

    또한 엔드 포인트를 완료하기 전에 관계의 양쪽을 설정해야합니다;

    Optional.ofNullable(loginCredential.getUser())
            .ifPresent(user -> user.setLoginCredential(loginCredential));
    loginCredentialRepo.save(loginCredential);
    
  2. ==============================

    2.당신은 사용자 개체에 대한 @GeneratedValue 필요하지 않습니다

    당신은 사용자 개체에 대한 @GeneratedValue 필요하지 않습니다

    OneToOne에 대한 CascadeType 추가

    이렇게함으로써 당신은 LoginCredential을 저장할 때 데이터베이스에 사용자를 저장 최대 절전 모드 말한다.

    @Data
    @Entity
    public class LoginCredential implements Serializable {
    
       @Id
       @GeneratedValue(strategy = GenerationType.AUTO)
       Long userID;
    
       String eMail;
    
       String passwordHash;
    
       @OneToOne(cascade = {CascadeType.ALL}, mappedBy = "loginCredential", fetch = FetchType.LAZY)
       User user;
    }
    

    자세한 내용은이를 참조하십시오

  3. ==============================

    3.뿐만 아니라 직렬화 사용자 클래스를 확인합니다.

    뿐만 아니라 직렬화 사용자 클래스를 확인합니다.

  4. from https://stackoverflow.com/questions/58229715/transientpropertyvalueexception-in-spring-boot by cc-by-sa and MIT license