Внешний ключ Spring Data JPA в Child не сохраняется - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь использовать пружинные данные CrudRepository для сохранения родительской сущности, которая включает в себя несколько дочерних сущностей, однако у меня возникают проблемы с получением OID ограничения внешнего ключа в дочерней таблице для сохранения, когда я "сохраняю" родительскую сущность.

Таким образом, в приведенном ниже примере вызов контроллера с предоставленным JSON сохранит Ocean и 2 дочерних Fish.Однако FK OID в таблице Fish не устанавливается.

Начиная с JSON-запроса к контроллеру, вот код.JSON REQUEST

{
     "name":"Atlantic",
     "fishes": [
     {
         "name": "blue fin tuna"
     },
     {
        "name": "great white shark"
     }
     ]
}

ОКЕАННОЕ СУЩЕСТВО

@Entity
public class Ocean {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long oid;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = 
"ocean")
private Set<Fish> fishes; //yeah maybe a  bad example

РЫБНОЕ СУЩНОСТЬ

@Entity
public class Fish {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long fid;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "oid", nullable = false, updatable = false, insertable = 
true)
private Ocean ocean;
private String name;

РЕГУЛЯТОР

@PostMapping("/god/ocean")
public Ocean createOcean(@RequestBody Ocean ocean) throws BadRequestException 
{
    LOG.info("createOcean()");
    return oceanDao.save(ocean);
}

Хранилище

public interface IOceanDao extends CrudRepository<Ocean, Long> {
}

MySql TABLES

CREATE TABLE IF NOT EXISTS `mydb`.`OCEAN` (
`OID` INT NOT NULL AUTO_INCREMENT COMMENT '',
`NAME` VARCHAR(45) NOT NULL COMMENT '',
 PRIMARY KEY (`OID`)  COMMENT '');

CREATE TABLE IF NOT EXISTS `mydb`.`FISH` (
`FID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '',
`OID` INT(11) NULL  COMMENT '',
`NAME` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`FID`)  COMMENT '',
CONSTRAINT `FK_OID`
FOREIGN KEY (`OID`)
REFERENCES `mydb`.`OCEAN` (`OID`));

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

У меня была та же проблема, пока JsonManagedReference не пришёл ко мне на помощь.

Попробуйте изменить ваши сущности, включив их следующим образом:

В Сущности Океана:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = 
"ocean")
@JsonManagedReference
private Set<Fish> fishes;

В сущности Рыба:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "oid", nullable = false, updatable = false, insertable = 
true)
@JsonBackReference
private Ocean ocean;

Я не смог выяснить, почему это работает таким образом, поэтому, пожалуйста, дайте мне знать, если узнаете:)

0 голосов
/ 08 июня 2018

Используйте CascadeType.PERSIST, чтобы EntityManager автоматически сохранял все ваши дочерние сущности, попробуйте изменить сущность Ocean, как показано ниже

@Entity
public class Ocean {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long oid;

private String name;    
@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER, mappedBy ="ocean")
private Set<Fish> fishes;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...