database - 休眠关系问题
问题描述
我正在尝试使用 Hibernate 在 Oracle 数据库中存储几个对象。但是,我似乎无法获得正确的映射关系。就目前而言,我得到了NullPointerException。
最后,每个客户都应该包含一个 id、一个名字和姓氏、一个电子邮件和一组预订。
每个航班都应该包含一个航班号、一个起始时间和一个起始机场。
预订应有身份证、客户、航班、预订日期和预订座位数量。
目前我只是用一个客户来测试它,以免过于复杂,但我很困惑。
这是我到目前为止所做的:
主要的
import java.sql.Date;
import java.sql.Time;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAApplication {
private EntityManagerFactory entityManagerFactory;
public JPAApplication() {
Logger.getLogger("org.hibernate").setLevel(Level.ALL);
entityManagerFactory = Persistence.createEntityManagerFactory("DB1");
}
public void testFlights() {
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
Client firstClient = new Client("Kiro", "Betona", "kirobetona@gmail.com");
em.persist(firstClient);
}
public static void main(String[] args) {
JPAApplication app = new JPAApplication();
app.testFlights();
}
}
客户
import java.util.*;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
public class Client {
private int id;
private String firstName;
private String lastName;
private String email;
private Set<Booking> reservations;
Client(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void setId(int id) {
this.id = id;
}
@OneToMany(targetEntity = Booking.class, mappedBy="client", fetch=FetchType.EAGER)
public Set<Booking> getReservations() {
return reservations;
}
public void setReservations(Set<Booking> reservations) {
this.reservations = reservations;
}
}
预订
import java.util.Date;
import javax.persistence.*;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
@Entity
public class Booking {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private Client client;
private Flight flight;
private int bookedSeats = 1;
@Temporal(TemporalType.DATE)
private Date bookingDate;
Booking(Client client, Flight flight, Date bookingDate) {
this.client = client;
this.flight = flight;
this.bookingDate = bookingDate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name="id")
public Client getClient() {
return client;
}
@OneToOne
@PrimaryKeyJoinColumn(name="flight")
public Flight getFlight() {
return flight;
}
public int getBookedSeats() {
return bookedSeats;
}
public void setBookedSeats(int bookedSeats) {
this.bookedSeats = bookedSeats;
}
public Date getBookingDate() {
return bookingDate;
}
public void setBookingDate(Date bookingDate) {
this.bookingDate = bookingDate;
}
public void setClient(Client client) {
this.client = client;
}
public void setFlight(Flight flight) {
this.flight = flight;
}
}
航班
import java.sql.Time;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
public class Flight {
private String flightNumber;
private Time startingTime;
private String startingAirport;
Flight(String flightNumber, Time startingTime, String startingAirport) {
this.flightNumber = flightNumber;
this.startingTime = startingTime;
this.startingAirport = startingAirport;
}
@Id
@OneToOne(targetEntity = Booking.class, mappedBy="flight", fetch=FetchType.EAGER)
@PrimaryKeyJoinColumn(name="flight")
public String getFlightNumber() {
return flightNumber;
}
public Time getStartingTime() {
return startingTime;
}
public void setStartingTime(Time startingTime) {
this.startingTime = startingTime;
}
public String getStartingAirport() {
return startingAirport;
}
public void setStartingAirport(String startingAirport) {
this.startingAirport = startingAirport;
}
public void setFlightNumber(String flightNumber) {
this.flightNumber = flightNumber;
}
}
解决方案
当您在 Booking 中使用 @JoinColumn 注释时,我看到了一些混乱:您告诉 Booking 使用名为“id”的列作为客户端的外键,但这与 Booking 主键冲突。
您可以改为将列名分开,如下所示:
@JoinColumn(name="clientId")
此外,为了让 Hibernate 实例化 Entity 对象,该实体应该有一个无参数的构造函数。示例代码中已覆盖默认的无参数构造函数。
推荐阅读
- c# - 正在更改 SessionId 导致此错误“视图状态验证失败。原因:视图状态提供的完整性检查失败。”
- android - Activity.setTheme() 之后的 Activity.recreate() 导致活动泄漏
- unique - 根据第二列计算列中的不同值
- xcode - 目标的构建设置中没有“金属编译器”
- generics - Kotlin 中的协议实现可识别的推断类型
- xcode - 在某些设备上查看效果不佳
- coq - 当 Coq 扩展一个函数作为目标的一部分时,这意味着什么?
- couchdb - CouchDB 2.x 下 local_seq 的行为是什么?
- javascript - 两个给定时间戳Javascript剩余的时间百分比
- sql - SQL选择依赖于条件计数