Spring MVC,Hibernate,MySQL(数据库关系)

时间:2018-10-27 18:43:03

标签: mysql spring hibernate spring-mvc

作为培训项目的一部分,我创建了一个客运铁路运输数据库。用户注册,购买火车票。火车的路线上有几个车站。

请帮助,处理关系。

有几个实体:用户,票证,火车,车站,路线。

我将每个实体创建为:

@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;

如何为火车设置固定数量的座位,以及如何在购买机票时减少座位数量?

同站不难:id,名称,状态。 最后,路线:

@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 :(得分:0)

首先-不要对iD使用原始类型。使用Integer或更好的Long。 根据Hibernate文档:

  

我们建议您声明名称统一的标识符属性   在持久化类上,并且您使用可为空值(即,   非原始)类型。

关于座位。有两种方法。第一种方式: -您无需减少火车上的座位。它可以固定。当您的客户尝试购买车票时,您的应用程序就会查询该火车上所有车票的数据库。并且如果现有票数大于或等于火车容量,那么客户便无法购买票。但是,当您的所有座位都相等时,这种方法就很好(例如,没有公车等数字)。但是,如果您的座位数不相等(使用不同类型的座位),您可以选择第二种方法: -您必须拥有另一个实体SEATS,该实体具有ID,编号,价格等,并且与TRAIN具有ManyToOne关系。那时,TRAIN必须有下一个字段

@OneToMany(mappedBy = "train", cascade = CascadeType.ALL)
    private Set<Seat> seats;  
优点:     -如果您正确设置了getter和setter(并且不只是

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

,您必须在Google上搜索正确的设置员,因为如果您的设置员只能通过急切获取-这不是正确的设置员,则您将具有级联的优势(例如-从DB删除火车时,所有座位都将被删除自动)

缺点:     -双向关系可能是使用JPQL(N + 1等等,当表将超过1000行时会感觉到的性能)上的痛苦。所以有第三种方式:

  • 您仍然具有SEAT实体。火车可以知道任何关于座位的信息,但是在“座位”中您可以像这样

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

缺点:  -当您要删除火车时,首先应删除该火车上的所有座位

优点:  -它比JPQL的双向关系要快得多