作为培训项目的一部分,我创建了一个铁路客运数据库。用户注册,购买火车票。这列火车走的路线有几个车站。
请帮我处理好人际关系。
有几个实体:用户、车票、火车、车站、路线。
我将每个实体创建为:
@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;
请帮助我处理注解和关系,最重要的是,理解这一点。谷歌已经是紫色了,最好的理解来自实践。谢谢。
1条答案
按热度按时间zdwk9cvp1#
首先-不要对ID使用基元类型。使用整数或更好的long。根据hibernate文档:
我们建议您在持久类上声明一致命名的标识符属性,并使用可为null(即非基元)类型。
关于座位。有两种方法。第一种方法:你不需要减少火车上的座位。它是可以修复的。就在您的客户试图购买车票时,您的应用程序正在向数据库查询该列车上的所有车票。如果现有车票的数量大于或等于列车的载客量,客户就不能买票。但这样很好,当你们所有的座位都相等时(不要有数字,比如在公共汽车上)。但是如果你的座位不相等(火车的座位类型不同),你可以选择第二种方式:-你必须有另一个实体座位,它有身份证、号码、价格等,并且与火车有很多关系。在那个时候火车必须有下一个领域
优点:-如果你正确地设置了getter和setter(这不仅仅是
,你必须在谷歌上搜索正确的设置者,因为如果你的设置者只通过急切的获取工作-这不是正确的设置者),你将有级联的优势(例如-当你从数据库中删除火车,所有座位将被自动删除)
缺点:-当您使用jpql时,双向关系可能是性能上的难题(n+1等等,当您的表将超过1000行时,您会感觉到)。所以有第三种方法:
你还有座位。火车什么都知道,但在座位上你们有这样的野外火车
缺点:-当你想删除火车时,你应该首先删除火车上的所有座位
优点:-它比jpql的双向关系快得多