Spring MVC, Hibernate, MySQL (отношения с базой данных) - PullRequest
0 голосов
/ 27 октября 2018

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

Помогите, пожалуйста, разобраться с отношениями.

Существует несколько объектов: пользователь, билет, поезд, станция, маршрут.

Я создаю каждую сущность как:

@Entity
@Table(name = "...")
public class ... implements Serializable { ... }

Пользователь: id (первичный ключ), Эл. адрес, пароль, имя, Фамилия, Дата рождения, роль (например, пользователь / администратор).

С этим я все понимаю. Возникают дополнительные вопросы. Билет:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column("TICKET_ID")
private int id;

// One user can have multiple tickets?
@ManyToOne
@JoinColumn(name = "USER_ID")
private User user;

@Column(name = "SALE_TIME")
private Date saleTime;

// One train can have multiple tickets?
@ManyToOne
@JoinColumn(name = "TRAIN_ID")
private Train train;

@Column(name = "CARRIAGE")
private int carriage;

@Column(name = "PLACE")
private int place;

Здесь все в порядке? Далее ...

@Entity
@Table(name = "TRAINS")
public class Train implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "TRAIN_ID")
private int id;

@Column(name = "TRAIN_NUMBER")
private int number;

@Column(name = "SEATS")
private int seats;

// on the way for example
@Column(name = "STATUS")
private String status;

Как установить на поезд фиксированное количество мест и как их уменьшить при покупке билета?

Со станцией не сложно: идентификатор, имя, статус. И, наконец, маршрут:

@Entity
@Table(name = "ROUTE_POINT")
public class RoutePoint implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ROUTE_ID")
private int id;

// ?????????
@ManyToOne
@JoinColumn(name = "TRAIN_NUMBER")
private Train train;

// ?????????
@ManyToOne
@JoinColumn(name = "STATION_NAME")
private Station station;

@Column(name = "DATE_ARRIVAL")
private Date dateArrival;

@Column(name = "DATE_DEPARTURE")
private Date dateDeparture;

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

1 Ответ

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

Прежде всего - не используйте примитивные типы для iD. Используйте Integer или лучше Long. Согласно документации Hibernate:

Мы рекомендуем вам объявлять свойства идентификатора с последовательным именем на постоянные классы и что вы используете обнуляемый (то есть, не примитивный) тип.

О местах. Есть два пути. Первый способ: - Вам не нужно сокращать количество мест в поездах. Это можно исправить. Просто когда ваш клиент пытается купить билеты, ваше приложение выполняет запрос к базе данных для всех билетов на этот поезд. И если количество существующих билетов больше или равно количеству поездов, клиент просто не может купить билет. Но этот способ хорош, когда все ваши места равны (нет номеров, как, например, в автобусе). Но если ваши места не равны (поезд с различными типами мест), вы идете вторым путем: - У вас должна быть другая сущность SEATS, которая имеет идентификатор, номер, цену и т. Д. И т. Д. И имеет отношения ManyToOne с TRAIN. В это время TRAIN должен иметь следующее поле

@OneToMany(mappedBy = "train", cascade = CascadeType.ALL)
    private Set<Seat> seats;  

плюсы: - Если вы правильно установили геттеры и сеттеры (и это не просто

public setSeats (Set<Seat> seats) {
   this.seats = seats
}

, вы должны гуглить для правильных сеттеров, потому что, если ваши сеттеры работают только с нетерпением - это не правильные сеттеры, у вас будет преимущество каскадирования (например, когда вы удаляете поезд из БД, все места будут удалены автоматически)

минусы: - двунаправленные отношения могут быть проблемой в производительности, когда вы используете JPQL (N + 1 и т. д., и вы чувствуете это, когда ваша таблица будет более 1000 строк). Так что есть третий путь:

  • У вас все еще есть объект SEAT. Поезд может знать о местах что угодно, но в Seat у вас есть поле Поезд, как это

    @OneToOne
    public Train getTrain() {
        return train;
    }
    public void setTrain(Train train) {
        this.train = train;
    }
    

минусы: - Если вы хотите удалить поезд, вы должны сначала удалить все места из этого поезда

плюсы: - Это намного быстрее, чем двунаправленное отношение для JPQL

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