簡體   English   中英

Spring 引導 JPA:Kotlin 中的一對一共享密鑰問題

[英]Spring Boot JPA: One To One Shared Key Issue In Kotlin

我無法使用 Kotlin 在一對一單向關系中與子對象 object 共享父對象主鍵。

我已經看到這個問題在 java 中用下面的代碼解決了:

MovieDetail movieDetail = new MovieDetail();
movie.setMovieDetail(movieDetail);
movieDetail.setMovie(movie); //<-- This is required
MovieRepository.save(movie);

該代碼聲明 MovieDetail 需要 Movie object,因為 Movie object 包含 MovieDetail 將采用的 ID。

但是,在 Kotlin 中,它變成了循環依賴,其中 Movie 需要 MovieDetail,MovieDetail 需要 Movie,而 Movie 需要 MovieDetail 等等。

不知Kotlin如何解決。

這是我的代碼:

@Entity
@Table(name = "movie")
data class Movie(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    val id: Int,
    @Column(name = "movie_id", nullable = false, columnDefinition = "TEXT")
    val movieId: String,

    @OneToOne(cascade = [CascadeType.ALL])
    @PrimaryKeyJoinColumn
    var movieDetail: MovieDetail
)
@Entity
@Table(name = "movie_detail")
data class MovieDetail(
    @Id
    @Column(name = "id")
    val id: Int,
    @Column(name = "movie_id")
    val movieId: String,
    @Column(name = "title")
    val title: String
    
    @MapsId
    @OneToOne
    @JoinColumn(name = "id")
    var movie: Movie
)
class MovieDataSourceImpl(private val movieRepo: MovieRepo) : MovieDataSource {
...
    override fun createMovie(movie: Movie): Movie {
        return if (movieRepo.findById(movie.id).isEmpty) {
            val movieDetail = movie.movieDetail
            movieDetail.movie = movie
            movie.movieDetail = movieDetail
            movieRepo.save(movie)
        } else {
            throw IllegalArgumentException("A movie with the 'id' ${movie.id} already exists")
        }
    }
...
}

這是我正在發出的 POST 請求的主體:

{
    "movieId": "1003",
    "posterPath": "myPosterPath",
    "movieDetail": {
        "movieId": "1003",
        "title": "title"
    }
}

這是我得到的錯誤:

它抱怨 MovieDetail 中缺少一個 Movie object,這就是我提到的循環依賴。

JSON parse error: Instantiation of [simple type, class com.tinnovakovic.springboot.fluttermovierest.model.MovieDetail] value failed for JSON property movie due to missing (therefore NULL) value for creator parameter movie which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class com.tinnovakovic.springboot.fluttermovierest.model.MovieDetail] value failed for JSON property movie due to missing (therefore NULL) value for creator parameter movie which is a non-nullable type
 at [Source: (PushbackInputStream); line: 19, column: 5] (through reference chain: com.tinnovakovic.springboot.fluttermovierest.model.Movie["movieDetail"]->com.tinnovakovic.springboot.fluttermovierest.model.MovieDetail["movie"])]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM