ошибка получения «отсоединенная сущность передана для сохранения» при весенней загрузке с гибернацией при обновлении строки - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть два класса моделей, два репозитория, два сервисных и два контроллера, как показано ниже.

    public class ABC {

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

        @Column(name = "abcField1")
        String abcField1;

        @NotNull
        @Email
        @Column(name = "abcField2")
        String abcField2;

        //getter and setters
    }   

    public class XYZ {

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

        @NotNull
        @Column(name = "xyzField1")
        String xyzField1;

        @NotNull
        @Column(name = "xyzField2")
        String xyzField2;

        @ManyToOne(cascade=CascadeType.PERSIST)
        @JoinColumn(name = "abc_id", referencedColumnName = "id")
        ABC abc;

        //getter and setters
    }   

@RestResource(exported = false)
public interface ABCRepository extends CrudRepository<ABC, Long> {

}

@RestResource(exported = false)
public interface XYZRepository extends CrudRepository<XYZ, Long> {

}

@Service
public class XYZService {

    @Autowired
    XYZRepository xyzRepository;

    public XYZ save(XYZ x) {
        return xyzRepository.save(x);
    }
}

@Service
public class ABCService {

    @Autowired
    ABCRepository abcRepository;

    public ABC save(ABC a) {
        return abcRepository.save(a);
    }
}

public class ABCController {

    @Autowired
    ABCService abcService;

    @PostMapping(path = "/abc/save")
    public ResponseEntity<ABC> register(@RequestBody ABC a) {
        return ResponseEntity.ok(abcService.save(a));
    }
}

public class XYZController {

    @Autowired
    XYZService xyzService;

    @PostMapping(path = "/xyz/save")
    public ResponseEntity<XYZ> register(@RequestBody XYZ x) {
        return ResponseEntity.ok(xyzService.save(x));
    }
}

Проблема в том, что когда я пытаюсь сохранить ниже JSON, он собирается вставлять строку в таблицу ABC каждыйвремя.

{
"xyzField1": "XYZ1", 
"xyzField2": "XYZ2",
"abc":{
    "abcField1": "ABC1",
    "abcField2": "ABC2",
    .
    .
  },
.
.
}

И я хочу обновлять строку таблицы ABC вместо добавления каждый раз, поэтому, когда я передаю поле идентификатора ниже json, как показано ниже, тогда я сталкиваюсь с ошибкой "org.springframework.dao.InvalidDataAccessApiUsageException:отсоединённая сущность передана для сохранения "

{
"xyzField1": "XYZ1", 
"xyzField2": "XYZ2",
"abc":{
    "id" : "1",
    "abcField1": "ABC1",
    "abcField2": "ABC2",
    .
    .
  },
.
.
}

Я попытался найти решение для этого, и они предлагают, чтобы метод сохранения CrudRepositary автоматически обновлялся, когда мы передаем идентификатор в JSON, но он не работает в моем случае.

1 Ответ

0 голосов
/ 10 декабря 2018

Похоже, проблема здесь связана с типом каскада , который вы предоставляете.Поскольку это PERSIST, поэтому всякий раз, когда вы пытаетесь сохранить свою родительскую сущность (т.е. сущность XYZ), hibernate также пытается сохранить вашу дочернюю сущность (то есть ABC сущность).Поскольку в ABC уже имеется строка с идентификатором 1, вы сталкиваетесь с этой проблемой.

Поэтому следует изменить тип каскада на MERGE, чтобы удовлетворить оба случая.

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