Спящие отношения - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь сохранить пару объектов в базе данных Oracle , используя Hibernate . Тем не менее, я не могу понять правильные отношения картографирования. В настоящее время я получаю NullPointerException .

В конце концов, каждый Клиент должен содержать идентификатор, имя и фамилию, адрес электронной почты и набор бронирований .

Каждый рейс должен содержать номер рейса, время начала и начальный аэропорт .

бронирования должны иметь идентификатор, клиента, рейс, дату бронирования и количество забронированных мест .

В данный момент я просто тестирую его с одним клиентом, чтобы не слишком усложнять, но я запутался.

Вот что я сделал до сих пор:

Main

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

}

1 Ответ

0 голосов
/ 06 мая 2019

Я вижу некоторую путаницу, когда вы используете аннотацию @JoinColumn в Booking: вы указываете Booking использовать столбец с именем "id" в качестве внешнего ключа для клиента, однако это противоречит первичному ключу Booking.

Вместо этого вы можете разделить имя столбца следующим образом:

@ JoinColumn (имя = "ClientId")

Кроме того, чтобы Hibernate создавал объекты Entity, у сущности должен быть конструктор без аргументов . Конструкторы по умолчанию без аргументов были переопределены в примере кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...