Рубрики
Без рубрики

Не Пропустите Эти Два Важных Совета По Переходу В Спящий Режим

Избегайте Двунаправленных Отношений ☝ ️ В двунаправленных отношениях мы должны помнить об этом… С тегом java, веб-разработчик, программирование, учебное пособие.

Избегайте двунаправленных Отношений ☝️

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

Если мы этого не сделаем, один из двух концов будет иметь нулевую ссылку на другой, и мы испортим наши данные 😿

Более того, для нас очень необычно пересекать отношения в обоих направлениях.

Давайте рассмотрим пример 👇

Допустим, у нас есть объекты Order и OrderLine, которые имеют отношение “один ко многим”.

Давайте сделаем это двунаправленным способом 🚫

@Entity
@Table(name = "ORDERS")
@Data
public class Order{
    @Id
    @GeneratedValue
    Integer id;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    List orderLines = new ArrayList<>();
}

@Entity
@Data
public class OrderLine
{
    @Id
    @GeneratedValue
    Integer id;

    @ManyToOne
    Order order;
}

Итак, чтобы убедиться, что у нас настроены оба конца, нам нужно

Order order = new Order();

OrderLine orderLine = new OrderLine();
orderLine.setOrder(order);

order.getOrderLines().add(orderLine);

entityManager.persist(order);

А теперь давайте сделаем это однонаправленным способом ✅

@Entity
@Table(name = "ORDERS")
@Data
public class Order{
    @Id
    @GeneratedValue
    Integer id;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "ORDER_ID")
    List orderLines = new ArrayList<>();
}

@Entity
@Data
public class OrderLine
{
    @Id
    @GeneratedValue
    Integer id;
}

Выполнение следующих действий должно сохранить обе сущности.

Order order = new Order();

OrderLine orderLine = new OrderLine();

order.getOrderLines().add(orderLine);

entityManager.persist(order);

Ограничивать Отношения С Помощью Числовых Идентификаторов ☝🏾

Для объектов, имеющих разные контексты, представляйте отношения между ними с помощью идентификаторов, а не фактических классов.

Допустим, у нас есть объект OrderLine и объект Product.

@Entity
@Data
public class OrderLine
{
    @Id
    @GeneratedValue
    Integer id;

    @ManyToOne
    Product product;
}

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Product
{
    @Id
    @GeneratedValue
    Integer id;
}

В этом случае, если мы выберем объект строки заказа, то Продукт также будет извлечен с нетерпением, потому что поведение по умолчанию ManyToOne является НЕТЕРПЕЛИВЫМ |/получателем 🏃🏽 ♂ ️

Плюс директор BBB говорит, что мы должны отделять объекты Product и OrderLine друг от друга, потому что они принадлежат к разным контекстам.

Лучший способ – включить товар в строку заказа в качестве идентификатора.

Примерное время 🏋🏽 ♂ ️

@Entity
@Data
public class OrderLine
{
    @Id
    @GeneratedValue
    Integer id;

    Integer productId;
}

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

Product product = new Product();  
entityManager.persist(product);  

Order order = new Order();  

OrderLine orderLine = new OrderLine();  
order.getOrderLines().add(orderLine);  
orderLine.setProductId(product.getId());  

entityManager.persist(order);

Кредиты 🙌 🏾

Этот пост был сделан в основном по материалам Victor Rentals Разработка выразительных моделей сохранения производительности и производительности для реляционных баз данных .

Оригинал: “https://dev.to/jarjanazy/dont-miss-these-two-important-hibernate-tips-36ef”