首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate关系问题

Hibernate关系问题
EN

Stack Overflow用户
提问于 2019-05-06 10:46:20
回答 1查看 37关注 0票数 0

我试图使用Hibernate将两个对象存储在一个Oracle数据库中。然而,我似乎不能正确地理解映射关系。照现在看来,我得到了一个NullPointerException.

最后,每个客户端都应该包含一个id、一个名字和一个姓、一封电子邮件和一组预订

每一次航班都应该包含,一个航班号,一个开始时间和一个开始机场

预订时必须有的身份证、客户、航班、预订日期和预订的座位数量。

目前,我只是在对单个客户进行测试,以避免过于复杂,但我已经相当困惑了。

以下是我到目前为止所做的工作:

代码语言:javascript
复制
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();
    }
}

客户端

代码语言:javascript
复制
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;
    }
}

预订

代码语言:javascript
复制
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;
    }
}

航班

代码语言:javascript
复制
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;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2019-05-06 12:11:14

当您在预订中使用@JoinColumn注释时,我看到了一些困惑:您告诉预订人员使用一个名为"id“的列作为客户端的外键,但是这与预订主键相冲突。

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

@JoinColumn(name="clientId")

另外,对于Hibernate实例化实体对象,实体应该有一个no-arg构造函数。。默认的no构造函数已在示例代码中重写。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56003611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档