[英]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.