Как создать 2 разных объекта с одним HTTP-запросом (файл JSON) - PullRequest
0 голосов
/ 19 февраля 2019

Я сделал базу данных с помощью Java Spring и Hibernate.Существует ответственная сущность и учетная запись, и они связаны отношением OneToOne.Вот мой код:

Контроллер REST:

@RestController
@RequestMapping("/test")
public class test {

    @Autowired
    private final ResponsableDBRepository responsableDBRepository;

    public test(ResponsableDBRepository responsableDBRepository){
        this.responsableDBRepository = responsableDBRepository;
    }

    @RequestMapping(method = RequestMethod.POST)
    ResponseEntity<?> insert(@RequestBody ResponsableEntity responsableEntity) {
        responsableDBRepository.save(responsableEntity);
        return ResponseEntity.accepted().build();
    }
}

Ответственная организация:

@Entity
@Table(name = "responsable")
public class ResponsableEntity {

    /**
     * Id of the resident
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * First name of the responsable
     */
    @Column(nullable=false)
    private String firstName;

    /**
     * Lst name of the responsable
     */
    @Column(nullable=false)
    private String lastName;

    /**
     * Account id of the responsable
     */
    //@Column(nullable=false)
    @OneToOne
    @JoinColumn(name = "account", referencedColumnName = "id")
    private AccountEntity account;

Организация учетной записи:

@Entity
@Table(name = "account")
public class AccountEntity {

    /**
     * Id of the acount
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * Username of the acount
     */
    @Column(nullable=false)
    private String username;

    /**
     * Password of the account
     */
    @Column(nullable=false)
    private String password;

Что я хотелдля этого нужно отправить запрос POST HTTP на мой контроллер (/ test) и отправить JSON для создания учетной записи и ответственного за нее, а также связать их в базе данных

Это проект, который у меня есть для школы, и этоВ первый раз я использую Spring и Hibernate, поэтому я не могу сказать, возможно ли это или нет, и как написать JSON, если это возможно

Я уже немного попробовал, но ничего не работает, и я ненайди мой ответ в интернете

Заранее спасибо за ответ!

Ответы [ 2 ]

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

Вы не предоставили код для ResponsableDBRepository, но я предполагаю, что где-то он вызывает persist в экземпляре ResponsableEntity.

Если ваша проблема в том, что AccountEntity, на который вы ссылались изResponsableEntity не сохраняется, возможно, ваша проблема в том, что вы не сказали Hibernate о каскадном переносе операции с ResponsableDBRepository на AccountEntity.Вам нужно использовать хотя бы @OneToOne(cascade = CascadeType.PERSIST), но вы можете захотеть CascadeType.ALL.

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

Вам просто нужно отправить объект в Body части вашего POST request.Вот пример, попробуйте сделать POST-запрос к вашему URL (используя Postman или любой подобный инструмент) с помощью следующего Body (raw/JSON (application/json) )

{
    "firstName": "your_first_name",
    "lastName": "your_last_name",
    "account": 
        {

            "username": "account_username",
            "password": "account_password"
        }

}

Если вы хотите вместе с parent-entity (ResponsableEntity) для сохранения дочерней сущности (Account) ваши модели должны будут выглядеть следующим образом

//ResponsableEntity  class
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "id")
private Account account;

//Account class
@OneToOne(mappedBy = "account", cascade = CascadeType.ALL,
fetch = FetchType.LAZY, optional = false)
private ResponsableEntity  responsableEntity;

Имейте в виду, что, как справедливо сказал Уиллис Блэкберн, вам может понадобиться использовать только cascade = CascadeType.PERSIST вместо всех (ALL включает тип PERSIST).

Подробнее о типах каскадов можно узнать здесь

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