Как автоматически вставить значение в сопоставленные столбцы `@ OrderBy` в JPA / Hibernate? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть связанные объекты: Один User -> много Orders.

    @OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = LAZY)
    private List<Order> orders;

Я хочу получать заказанные заказы, когда выбираю пользователя и получаю от него все заказы.Я могу создать новое поле в таблице заказов ordinal_number и добавить @OrderBy аннотацию:

@OrderBy("ordinal_number")
@OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = LAZY)
private List<Order> orders;

Но я не понимаю, как можно вставить правильное значение в ordinal_number во время сохранения.Я создаю пользователя, создаю список заказов, добавляю пользователя к каждому заказу и добавляю список заказов пользователю.И сохранить пользователя.Примитивный способ - создайте переменную int, добавьте ее вручную к каждому ордеру и увеличивайте.Но может быть есть какие-то способы сделать это автоматически?(например, добавить какой-нибудь генератор, автоинкремент или что-то другое)?

РЕДАКТИРОВАТЬ:

Мой класс заказа:

EqualsAndHashCode(exclude = "user")
@Data
@Entity
@Table(name = "orders")
public class Order {

    @Id
    private String id;

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

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "insert_date")
    private Date insertDate = new Date();

    @Column(name = "ordinal_number")
    private Integer ordinalNumber;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}

Мой класс пользователя:

@ToString(exclude = "orders")
@Data
@Entity
@Table(name = "users")
public class User {

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

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

    @OrderColumn(name = "ordinal_number")
    @OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = LAZY)
    private List<Order> orders;
}

1 Ответ

1 голос
/ 26 апреля 2019

OrderBy используется для сортировки элементов.

Предположим, у вас есть List<Person>, и у каждого человека есть имя, и вы захотите отсортировать людей по имени.

Если несколько человек имеют одинаковые имена, они будут рядом друг с другом в списке.

Если вы измените имя человека, то в следующий раз, когда вы получите этот список, положение этого человека в списке будет изменено в соответствии с его новым именем.

Что вы, очевидно, хотитеЭто не так, но вместо этого вы хотите сохранить порядок вставки ордеров в список.Т.е. есть List<Order>, который всегда содержит первый порядок, затем второй, затем третий.И если вы добавите 4-й, он всегда должен быть на 4-й позиции.

Вот для чего OrderColumn.

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