spring mvc、hibernate、mysql(数据库关系)

fjaof16o  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(323)

作为培训项目的一部分,我创建了一个铁路客运数据库。用户注册,购买火车票。这列火车走的路线有几个车站。
请帮我处理好人际关系。
有几个实体:用户、车票、火车、车站、路线。
我将每个实体创建为:

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

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

zdwk9cvp

zdwk9cvp1#

首先-不要对ID使用基元类型。使用整数或更好的long。根据hibernate文档:
我们建议您在持久类上声明一致命名的标识符属性,并使用可为null(即非基元)类型。
关于座位。有两种方法。第一种方法:你不需要减少火车上的座位。它是可以修复的。就在您的客户试图购买车票时,您的应用程序正在向数据库查询该列车上的所有车票。如果现有车票的数量大于或等于列车的载客量,客户就不能买票。但这样很好,当你们所有的座位都相等时(不要有数字,比如在公共汽车上)。但是如果你的座位不相等(火车的座位类型不同),你可以选择第二种方式:-你必须有另一个实体座位,它有身份证、号码、价格等,并且与火车有很多关系。在那个时候火车必须有下一个领域

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

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

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

,你必须在谷歌上搜索正确的设置者,因为如果你的设置者只通过急切的获取工作-这不是正确的设置者),你将有级联的优势(例如-当你从数据库中删除火车,所有座位将被自动删除)
缺点:-当您使用jpql时,双向关系可能是性能上的难题(n+1等等,当您的表将超过1000行时,您会感觉到)。所以有第三种方法:
你还有座位。火车什么都知道,但在座位上你们有这样的野外火车

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

缺点:-当你想删除火车时,你应该首先删除火车上的所有座位
优点:-它比jpql的双向关系快得多

相关问题