Hibernate: дублированные элементы с отношением OnetoOne, сохраняющие список - PullRequest
0 голосов
/ 03 февраля 2019
@Entity
public class TestPair implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    @OneToOne(cascade = {CascadeType.ALL})
    @JsonProperty("target_Test")
    private Test targetTest;
    @OneToOne(cascade = {CascadeType.ALL})
    @JsonProperty("source_Test")
        private Test sourceTest;
...}

@Entity
public class Test {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String name;
    private String shortname;
...}

У меня есть List<TestPair>, который я хочу сохранить, используя весеннюю загрузку CrudRepository.

TestPair содержат Test, и эти Test совпадают с некоторыми из TestPair.

Когда я использую метод saveAll, он сохраняет объекты, но Test, которые равны, он вставляет новые, создаваямного повторяющихся элементов в БД.

Я создал равенства и хэш-код для этих классов.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Я нашел решение.

Вместо того, чтобы использовать crud saveAll для Hashset, я сохраняю по одному.

for(TestPair tPair : TPairs){
    testRepository.save(tPair.getSourceTest());
    testRepository.save(tPair.getTargetTest());
    testPairRepository.save(tPair);
}

И изменил классы на:

@Entity
public class TestPair implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    @OneToOne(cascade = {CascadeType.MERGE})
    @JsonProperty("target_Test")
    private Test targetTest;
    @OneToOne(cascade = {CascadeType.MERGE})
    @JsonProperty("source_Test")
    private Test sourceTest;
}

@Entity
public class Test {
    private String name;
    @Id
    private String shortname;
}

Таким образом, hibernate объединяет объекты, а не создает новые.Спасибо всем!

0 голосов
/ 03 февраля 2019

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

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