首页 > 解决方案 > 休眠关系问题

问题描述

我正在尝试使用 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;
    }

}

标签: databasehibernate

解决方案


当您在 Booking 中使用 @JoinColumn 注释时,我看到了一些混乱:您告诉 Booking 使用名为“id”的列作为客户端的外键,但这与 Booking 主键冲突。

您可以改为将列名分开,如下所示:

@JoinColumn(name="clientId")

此外,为了让 Hibernate 实例化 Entity 对象,该实体应该有一个无参数的构造函数。示例代码中已覆盖默认的无参数构造函数。


推荐阅读