Arhn - архитектура программирования

SpringBoot: это правильный способ сохранить новую запись, имеющую отношение ManyToOne?

У меня есть две сущности Person и Visit

Person имеет отношения OneToMany с Visit. Мне было интересно, хочу ли я сохранить новую запись Visit и использовать RestController. Мой подход правильный? Или есть другой способ, более эффективный?

Итак, у меня есть следующий контроллер, который принимает VisitModel из RequestBody, это правильный способ называть его так?

VisitModel имеет идентификатор человека и необходимые свойства для сущности Visit. Я использую идентификатор человека для поиска в personRepository соответствующей записи Person, после чего отправляю ее новому экземпляру Visit, а затем использую visitRepository для ее сохранения.

@RequestMapping(value="", method=RequestMethod.POST)
public String checkIn(@RequestBody VisitModel visit) {

    Person person = personRepository.findById(visit.personId);

    Visit newVisit = new Visit(visit.getCheckIn, person);
    visitRepository.save(newVisit);

    return "success";
}

Сущность посещения выглядит следующим образом

@Entity
public class Visit {

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

    @JsonProperty("check_in")
    private Date checkIn;

    @JsonProperty("check_out")
    private Date checkOut;

    @ManyToOne
    @JoinColumn(name="personId")
    private Person person;

    public Visit(Date checkIn, Person person) {
        this.checkIn = checkIn;
        this.person = person;
    }

    public Date getCheckIn() {
        return checkIn;
    }

    public void setCheckIn(Date checkIn) {
        this.checkIn = checkIn;
    }

    public Date getCheckOut() {
        return checkOut;
    }

    public void setCheckOut(Date checkOut) {
        this.checkOut = checkOut;
    }

    public Person getPerson() {
        return person;
    }

}

Хочу знать, что следующий подход правильный. Или есть другой способ лучше?


  • одна оптимизация, которую я вижу, заключается в том, что вместо получения объекта человека с помощью метода репозитория вы можете создать объект человека с помощью нового оператора, заполнить поле идентификатора и использовать его. Это сохранит попадание в БД для получения объекта человека. 03.03.2016
  • @MadhusudanaReddySunnapu, ты имеешь в виду следующее new Person(personId);? 03.03.2016
  • да. Вы видите какие-либо проблемы с этим? 03.03.2016

Ответы:


1

Конечно, вам не нужно получать Person из базы данных, чтобы связать его с Visit. По этой причине вам нужно иметь только id из Person, чтобы сохранить его в столбце внешнего ключа personId.

Если вы используете JPA EntityManager

  Person person = entityManager.getReference(Person.class, visit.personId);

для Hibernate Session

  Person person = session.load(Person.class, visit.personId);

Эти методы просто создают прокси и не выполняют никаких запросов к базе данных.

В Hibernate Session я использовал new Person(personId), как предложил @MadhusudanaReddySunnapu. Все нормально работало.

В чем разница между EntityManager.find () и EntityManger.getReference ()?

Hibernate: разница между session.get и session.load

03.03.2016
  • При использовании new Person(personId) запись из базы данных не загружалась. Однако он хорошо работал с EntityManager. И с Session я не мог ввести его с помощью @Autowired. Как я могу получить экземпляр сеанса? 03.03.2016
  • @starcorn Если вы используете EntityManager - используйте getReference() или new Person(personId) (если работает, конечно). Не смешивайте, используя EntityManager и Session. Чтобы ответить на ваш вопрос: вы можете создать сеанс из EntityManager Session session = entityManager.unwrap(Session.class); 04.03.2016

  • 2

    Да, мне кажется, это стандартный способ сопоставить bidirectional отношения. РЕДАКТИРОВАТЬ: столбец personId указывает на поле «id» объекта Person. Например:

    @Id
    private Long id;
    

    ОБНОВЛЕНИЕ: 1: VisitModel - это «DTO» или объект передачи данных. Подойдет любой отдельный пакет. Вы можете рассмотреть возможность помещения их в отдельную банку, чтобы любой, кто использует ваш API (с java), мог использовать банку для создания данных перед вызовом. 2) Насколько я понимаю, способ сохранения хорош.

    03.03.2016
  • Тогда в какой пакет вы бы положили VisitModel. Прямо сейчас у меня есть классы Entity и Repository, содержащиеся в пакете домена. Но VisitModel туда не вписывается. 03.03.2016
  • Итак, чтобы сохранить запись о посещении, вы бы также поступили так же, как я? Сначала найдите человека с personId, а затем отправьте его новому экземпляру Visit? 03.03.2016
  • благодаря. Не знал, что DTO было концептуальным названием для этого :) 03.03.2016
  • Не понимаю, почему это должно быть: Столбец personId должен иметь имя personId и в вашем объекте Person, если он имеет имя 03.03.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..