У меня есть Kotlin проект весенней загрузки, в котором я столкнулся с проблемой. У меня есть 3 класса, которые связаны друг с другом. Идентификаторы в этих классах имеют тип Long. Эти классы являются: Obywatel, Model и Pojazd. Pojazd имеет внешние ключи для Obywatel и Model следующим образом:
@ManyToOne(fetch = FetchType.EAGER, cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "model_id")
@JsonBackReference(value = "mod-poj")
@JsonIdentityInfo(scope = Model::class,generator = ObjectIdGenerators.PropertyGenerator::class, property = "model_id")
@JsonIdentityReference(alwaysAsId = true)
var model : Model,
@ManyToOne(fetch = FetchType.EAGER, cascade = arrayOf(CascadeType.ALL))
@JoinColumn(name = "obywatel_id")
@JsonBackReference(value = "poj-ob")
@JsonIdentityInfo(scope = Obywatel::class,generator = ObjectIdGenerators.PropertyGenerator::class, property = "obywatel_id")
@JsonIdentityReference(alwaysAsId = true)
var obywatel : Obywatel,
Чтобы добавить новый Pojazd, я использую json следующим образом:
{
"id" : -1,
"kolor" : "szary",
"uwagi" : "wlasny",
"nr_rejstracyjny_pojazdu" : "GSP 6666",
"rok_produkcji" : 1966,
"czy_zarchiwizowany" : false,
"model" : {
"id" : 2
},
"obywatel" : {
"id" : 1
},
"abonamenty" : [ ]
}
Если идентификатор модели и Obywatel различаются (
"model" : {
"id" : 2 },
"obywatel" : {
"id" : 1 },
), все работает хорошо
Но если они были равны по значению, как (
"model" : {
"id" : 2 },
"obywatel" : {
"id" : 2 },
)
Я получаю сообщение об ошибке типа
{
"timestamp" : "2020-02-03T14:19:32.788+0000",
"status" : 400,
"error" : "Bad Request",
"message" : "JSON parse error: Already had POJO for id (java.lang.Long) [[ObjectId: key=2, type=com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator, scope=java.lang.Object]]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.Long) [[ObjectId: key=2, type=com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator, scope=java.lang.Object]] (through reference chain: com.filip.machaj.demo.dto.PojazdDTO[\"obywatel\"]->com.filip.machaj.demo.model.dane.Obywatel[\"id\"])",
"path" : "/pojazd/insert"
}
Никто из моих старших друзей даже не подозревал, как решить эту проблему.
Но решили эту проблему, изменив идентификатор модели от типа Long до Int. Так как все идентификаторы в моих классах были типа Long.
И вот у меня есть 3 вопроса для вас, ребята:
Это единственное решение этой проблемы?
Представьте себе было не 3 класса, а как 30 с той же проблемой и что тогда (поскольку есть только 3 или простые типы, такие как Int, Int Long, Short)?
Так возможно ли это? сделать копии Int или Long, какой компилятор будет рассматривать разные типы? Это возможно в Kotlin или Java?