【问题标题】:Spring MVC, Hibernate, MySQL (database relationships)Spring MVC、Hibernate、MySQL(数据库关系)
【发布时间】:2019-04-01 04:25:39
【问题描述】:

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

请帮忙处理人际关系。

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

我将每个实体创建为:

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

如何设置火车固定座位数,购票时如何减少?

用Station并不难:id、name、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;

请帮助我处理注释和关系,最重要的是,理解这一点。谷歌已经是紫色了,最好的理解来自实践。谢谢。

【问题讨论】:

    标签: mysql spring hibernate spring-mvc


    【解决方案1】:

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

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

    关于座位。有两种方法。第一种方式: - 你不需要减少火车上的座位。它可以修复。就在您的客户尝试购买车票时,您的应用程序正在查询该火车上所有车票的数据库。如果现有票的数量大于或等于火车容量,客户就无法购买票。但这种方式很好,当你所有的座位都是平等的(没有数字,比如在公共汽车上)。但是,如果您的座位不相等(使用不同类型的座位进行火车),您可以选择第二种方式: - 你必须有另一个实体 SEATS,它有 id、number、price 等,并且与 TRAIN 有 ManyToOne 关系。在那个时候 TRAIN 必须有下一个字段

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

    优点: - 如果你正确地设置了 getter 和 setter(不仅仅是

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

    ,您必须在谷歌上搜索正确的设置器,因为如果您的设置器仅通过急切获取 - 它不是正确的设置器),您将拥有级联的优势(例如 - 当您从 DB 中删除火车时,所有座位都将被删除自动)

    缺点: - 使用 JPQL(N+1 等,当您的表超过 1000 行时,您会感觉到双向关系)。所以还有第三种方式:

    • 您仍然拥有 SEAT 实体。 Train 可以知道任何关于座位的信息,但在 Seat 中,您有像这样的字段 Train

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-19
      • 2016-03-31
      • 2017-03-08
      • 2016-08-15
      • 2016-12-13
      • 2020-08-05
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多