Я не могу использовать внешние ключи одинакового значения в Kotlin Spring boot - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть 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 вопроса для вас, ребята:

  1. Это единственное решение этой проблемы?

  2. Представьте себе было не 3 класса, а как 30 с той же проблемой и что тогда (поскольку есть только 3 или простые типы, такие как Int, Int Long, Short)?

  3. Так возможно ли это? сделать копии Int или Long, какой компилятор будет рассматривать разные типы? Это возможно в Kotlin или Java?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...