Таблица репозитория JPA не сохраняет новые идентификаторы, но переопределяет или модифицирует - PullRequest
0 голосов
/ 02 апреля 2020

У меня A.class :

@Entity
@Data
public class A {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    Integer id;

    String someStringInAclass;

    @OneToMany(cascade = CascadeType.ALL)
    List<SomeObject> someObjectsList;
}

У меня SomeObject.class :

@Entity
@Data
public class SomeObject {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    Integer id;
    String someString;
    Integer someInteger;
}

Я сохраняю объект в база данных:

SomeRepository.save(A);

И таблицы выглядят так:

enter image description here

Затем я снова сохраняю объект с другими значениями в объекте B :

SomeRepository.save(A);

Тогда таблицы выглядят так:

enter image description here

Таблица B расширилась правильно, но таблица A_B просто переопределила B_id вместо того, чтобы поместить новые 4 строки.

Затем, когда я получаю объект A из базы данных, я получаю только последние 4 значения из объекта B.

Как заставить его работать с сохранением новых значений (добавление новые строки в A_B) без переопределения?

EDIT:

Я добавил A_id в качестве внешнего ключа в таблицу B. Опять же - первое сохранение сохраняется правильно:

enter image description here

Затем, после второго сохранения с другими значениями для B, он изменяет значения для столбца A_id для первых вставленных 4 значений (к нулю). Итак, таблица выглядит так:

enter image description here

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Hibernate обрабатывает однонаправленные отношения очень неэффективно, попробуйте использовать двунаправленные отношения.

Что касается вышеупомянутой проблемы, вам не нужна третья таблица, вы можете избежать создания третьей таблицы, добавив @JoinColumn, как показано ниже:

     @OneToMany(cascade = CascadeType.ALL)   
     @JoinColumn(name = "fk_a_id")
     List<SomeObject> someObjectsList;

это добавит столбец "fk_a_id" в SOME_OBJECT таблица.

0 голосов
/ 02 апреля 2020

Я добавил: (nullable = false) параметр для @JoinColumn проблема решена.

Итак, над списком теперь есть:

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(nullable = false)
List<SomeObject> someObjectsList;
0 голосов
/ 02 апреля 2020

Поскольку объект уже сохранен и имеет назначенный идентификатор, JPA предполагает, что вы имеете в виду ту же запись в базе данных. Вам необходимо клонировать объект:

@Entity
@Data
public class A {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    Integer id;

    String someStringInAclass;

    @OneToMany(cascade = CascadeType.ALL)
    List<SomeObject> someObjectsList;

    public A(A source) {
        this.someStringInAclass = source.someStringInAClass;
        this.someObjectsList = new ArrayList<SomeObject>();

        for (SomeObject o : source.someObjectsList) {
            this.someObjectsList.add(new SomeObject(o));
        }
    }
}

Используйте его следующим образом:

SomeRepository.save(a);
A aClone = new A(a);
SomeRepository.save(aClone);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...